Вход

Просмотр полной версии : Создать функцию на ST



Страницы : 1 2 [3]

lagutin
30.12.2022, 09:49
Наверное, выходит, к целым нельзя пока применять побитовые операции

EFrol
30.12.2022, 10:53
Когда нельзя, но очень хочется, то ... ;)

64963

64964

melky
30.12.2022, 12:18
При этом если не ошибаюсь можно использовать просто AND без всякого ST

Сергей0308
30.12.2022, 12:28
При этом если не ошибаюсь можно использовать просто AND без всякого ST

Говорят, что уже нельзя!
Тогда мне непонятно как работают ранее сделанные проекты, у меня практически в каждом проекте такое используется!

melky
30.12.2022, 12:41
Матерюсь, при отсутствии прибора и выбора COM порт программа ТУПИТ безбожно, разработчики, почините что ли...

Можно вроде, версия 2.ххх

capzap
30.12.2022, 13:57
Можно вроде, версия 2.ххх

Ни чего что тема про ST

melky
30.12.2022, 14:41
capzap речь о том, что почему-то на ST не реализован AND с целочисленными в виде простого & , хотя в FB он работает.

Филоненко Владислав
31.12.2022, 22:18
capzap речь о том, что почему-то на ST не реализован AND с целочисленными в виде простого & , хотя в FB он работает.

Потому что это язык ST, а не C

melky
01.01.2023, 09:26
Филоненко Владислав С наступившим вас Новым(текущим) Годом :)

Как коня не назови, & или AND OR NOT, а ехать оно не хочет, судя по предыдущей странице.... при этом поставив кубик AND все работает как и задумано

wwowa
05.01.2023, 20:39
Включение и выключение насосов. Возможность вывода в ремонт. Общее число насосов можно задать вверху холста. В общем то в этом и был весь смысл. Аварии не реализованы, но это уже детали.
Чисто эксперимент.https://disk.yandex.ru/d/9A0zyGGd2R9Wwg

wwowa
07.01.2023, 21:20
Решил сделать сортировку. Объясните мне, что значит переменная udint 4 байта? Это я так понимаю что это 32 веса от 0 до 31... По справке это максимальное число 4*294*967*295. По калькулятору это 32 единички.. Все сходится. Но при попытке присвоить значение функции f.31:= true пишет ошибку "или маленькое или большое число"(это мой перевод:rolleyes:).
Объясните, где я не догоняю то???https://disk.yandex.ru/d/043NgOt7q9Ercg

capzap
07.01.2023, 21:55
Пробовали присвоить единицу?

Dimensy
07.01.2023, 22:40
Решил сделать сортировку. Объясните мне, что значит переменная udint 4 байта? Это я так понимаю что это 32 веса от 0 до 31... По справке это максимальное число 4*294*967*295. По калькулятору это 32 единички.. Все сходится. Но при попытке присвоить значение функции f.31:= true пишет ошибку "или маленькое или большое число"(это мой перевод:rolleyes:).
Объясните, где я не догоняю то???https://disk.yandex.ru/d/043NgOt7q9Ercg

Похоже еще один косяк ST обнаружился

capzap
07.01.2023, 23:37
Похоже еще один косяк ST обнаружился

у Вас тоже проявляется ошибка? Как она выглядит скрином покажите 65033

Dimensy
07.01.2023, 23:53
у Вас тоже проявляется ошибка? Как она выглядит скрином покажите 65033

65034


function function1: udint; //имя функции и тип данных выхода
var_input //объявление входных переменных
inputVariable : bool; //входная переменная с типом данных bool
end_var



function1.31 := inputVariable;

end_function

при этом

unction function1: udint; //имя функции и тип данных выхода
var_input //объявление входных переменных
inputVariable : bool; //входная переменная с типом данных bool
end_var



function1.30 := inputVariable;

end_function

отрабатывает нормально

65035

kondor3000
08.01.2023, 00:28
Это очередной БАГ на ST, на 10 Винде выглядит по другому
function1.30 :=true ; работает нормально 65038

Если function1.31 :=true ; то ошибка 65036

Если написать function1.31 :=1 ; то критическая ошибка 65037

wwowa
08.01.2023, 08:11
У меня не работает никак. Как бы я пытался что то присвоить 31 биту - сразу ошибка. И при прибавлении 2147483648 - тоже....
Это сторожевой бит)) какой то.
Вот еще цикл. Написано в справке везде во всех позициях в цикле выражения. Но вот так
for i := 0 to i<8 do тоже не дает. Говорит на месте i<8 должно быть целое. Наверное, урезали криво.
И обратится к биту по переменной тоже не дает f.var:= true -нельзя....
И без отладки тоже беда.:o Ну можно в кодесис наваять и отладить, а тут получится и то нельзя и то....
Но как то массивы есть, а какой то ерунды нет или глючит? ну как это так то????
"ps" содесис позволяет обратится к 31 биту
65039

capzap
08.01.2023, 09:27
ну раз появились проблемы с 31 разрядом, значит начались некие работы по использованию отрицательных целочисленных

wwowa
08.01.2023, 20:10
65042
На "от нуля до пока меньше 8" чё должна сказать ?

Должна провести цикл от нуля до 7... Это очень удобно, особенно при работе с массивами и прочими.
Как то так
for (var i = 0; i < items.length - 1; i++)
Ошибок на порядок уменьшается. Но в ST нет. Ну нет и нет...Чего уж тут теперь.
А что у вас присваивается 31 бит, а у меня нет - это еще хуже. У кого работает, у кого нет. Стабильности нет. В мире стабильности нет, в лоджике нет. Перебор, однако:o

lagutin
09.01.2023, 09:02
Здравствуйте! Вот такой вопрос. Два вложенных цикла. При переборе до 2500 - пишет бесконечный цикл. При 1000 уже считает все. А на основании каких данных цикл считается бесконечным, или он уложится в цикл программы. В содесис, насколько я почитал и понял есть сторожевой таймер. А здесь как то просчитать можно?

lagutin
11.01.2023, 17:02
Фоновая сортировка. https://cloud.mail.ru/public/JBy8/eQz4xByVK

ПавелП
09.02.2023, 23:34
Привет всем!

Делал кто "перевод" макросов на язык ST ?
Иногда надо подправить малость - мне проще в ST. :)

Вот попробовал с ходу перевести:
Преобразователь диапазона с ограничением SCALE.
Получаются разные результаты...

CompareADC:= (InADCa*((InMAX-InMIN)/(UotMAX-UotMIN))) - (InMIN*UotMAX-InMAX*UotMIN)/(UotMAX-UotMIN) ;
или ещё
CompareADC:= InMIN + (InADCa - UotMIN) * ( InMAX - InMIN )/(UotMAX - UotMin);

Чёт первый блин не получается...

InMIN, InMAX - предел входного параметра,
UotMIN, UotMAX - предел выходного параметра,
InADCa - входной сигнал,
CompareADC - выход.

capzap
10.02.2023, 08:25
Привет всем!

Делал кто "перевод" макросов на язык ST ?
Иногда надо подправить малость - мне проще в ST. :)

Вот попробовал с ходу перевести:
Преобразователь диапазона с ограничением SCALE.
Получаются разные результаты...[B]
установите КДС, воспользуйтесь одноименной библиотекой на oscat.de, там все функции на языке ST, адаптировать их под ОЛ куда проще чем с квадратиков переводить

ПавелП
10.02.2023, 08:52
установите КДС, воспользуйтесь одноименной библиотекой на oscat.de, там все функции на языке ST, адаптировать их под ОЛ куда проще чем с квадратиков переводить
Порылся, нашёл (https://ftp.owen.ru/CoDeSys3/98_Books/oscat_basic333_ru.pdf), посмотрел.
Много всего. Инфы поболее, чем с нуля начинать.

Спасибо! :)

ПавелП
10.02.2023, 08:55
Макросы уже есть на ST ?
Все REAL ?

математики, ля
прогеры, ля
постановщики задач, ля

:)

Первый раз, в первый класс...
Дали люди ссылку, будет поболее инфы, и меньше вопросов!

melky
10.02.2023, 09:24
double Scaler (double input, double in_min, double in_max, double out_min, double out_max)

{
double out1 = 0;
double out2 = 0;
double output = 0;
double diff = in_max - in_min;

if (diff != 0)
{
if (input > in_max) out1 = in_max;
else out1 = input;
if (in_min > out1) out2 = in_min;
else out2 = out1;
output = (out_max - out_min) / diff * (out2 - in_min) + out_min;
}
return output;
}

Скалирование на C#, вроде делал когда-то именно с oscat. хотя и не помню уже. Синтаксис примените СТшный.

ПавелП
11.02.2023, 01:30
Макросы уже есть на ST ?
Все REAL ?


математики, ля

CompareADC := (InADCa - InMIN) / (InMAX - InMIN) * (UotMAX - UotMin) + UotMin
[/CODE]
Всё работает!!! Совпадает с эталоном.

Спасибо! :)

ПавелП
11.02.2023, 01:33
double Scaler (double input, double in_min, double in_max, double out_min, double out_max)

{
double out1 = 0;
double out2 = 0;
double output = 0;
double diff = in_max - in_min;

if (diff != 0)
{
if (input > in_max) out1 = in_max;
else out1 = input;
if (in_min > out1) out2 = in_min;
else out2 = out1;
output = (out_max - out_min) / diff * (out2 - in_min) + out_min;
}
return output;
}

Скалирование на C#, вроде делал когда-то именно с oscat. хотя и не помню уже. Синтаксис примените СТшный.
Подошло.
Только контроль пределов не нужен.
Раз оттарировал, и заработало!
Спасибо! :)

ПавелП
11.02.2023, 01:46
установите КДС, воспользуйтесь одноименной библиотекой на oscat.de, там все функции на языке ST, адаптировать их под ОЛ куда проще чем с квадратиков переводить

Хм. Пролистал внимательно - оч интересно.
Много полезностей, нужное проверил - всё работает (https://ftp.owen.ru/CoDeSys3/98_Books/oscat_basic333_ru.pdf).

Прочитал шапку файла, и побродил по ссылкам:
1. 10 лет прошло, часть ссылок оттуда сдохла.
2. ST где-то рядом. Все решения достаточно описаны, но без исходников.
3. У некоторых макросов есть исходные формулы.

4. Винегрет из CFC, ST придётся городить.
Что, впрочем, позволит решить нужные задачи.

Нужен какой нить учебник или справочник по паскалю, с подробно разложенными библиотеками.

Cs-Cs
11.02.2023, 11:30
ПавелП
Все решения достаточно описаны, но без исходников Если речь идёт про OSCAT для CDS 2.3, то его надо не добавить в проект (тогда только шапка видна), а именно открыть как библиотеку. Тогда все исходники видны. Но написаны они ужасно. Без комментариев и с фиг какими именами переменных.
65842

kondor3000
11.02.2023, 11:42
Надо библиотеку открыть как проект, и скопировать код из блоков.

ПавелП
11.02.2023, 14:48
ПавелП Если речь идёт про OSCAT для CDS 2.3, то его надо не добавить в проект (тогда только шапка видна), а именно открыть как библиотеку. Тогда все исходники видны. Но написаны они ужасно. Без комментариев и с фиг какими именами переменных.
65842
Выходные. Посмотрел повнимательнее.
Вообще-то, если назначение и алгоритм понятные, то
в простых макросах разобраться можно.

Но есть монстры очень сложные.
Но они то и не очень нужны. :)

ПавелП
11.02.2023, 14:50
Надо библиотеку открыть как проект, и скопировать код из блоков.
Всё так. Я про комментарии.

Всё заметно упрощается, когда есть возможность
не "сидеть" в рамках макроса, а подкрутить его в свою сторону. :)

ПавелП
14.02.2023, 21:27
Привет всем.

Петренко опубликовал с год назад толковый пример (http://www.youtube.com/watch?v=Q6ETFE6dr4g)
"Овен ПЛК 110-М02 сохранение переменных REAL на USB FLASH в Excel"
но, как всегда, самое интересное утаил... :(

Макрос позволяет указанные переменные писать в лог фай на внешнюю флешку в формате Excel.
Где такое взять? Хоть в текстовый файл.

Есть описание Navigator_PLC_DVD_v3\04. Библиотеки\2022\Описание\OwenLibFileAsync.pdf.
Но там с ходу в 10 листах трудно разобраться.

capzap
14.02.2023, 22:10
Привет всем.

Петренко опубликовал с год назад толковый пример (http://www.youtube.com/watch?v=Q6ETFE6dr4g)
"Овен ПЛК 110-М02 сохранение переменных REAL на USB FLASH в Excel"
но, как всегда, самое интересное утаил... :(

Макрос позволяет указанные переменные писать в лог фай на внешнюю флешку в формате Excel.
Где такое взять? Хоть в текстовый файл.

Есть описание Navigator_PLC_DVD_v3\04. Библиотеки\2022\Описание\OwenLibFileAsync.pdf.
Но там с ходу в 10 листах трудно разобраться.

Причем здесь, в теме про реле, разговор по плк?

ПавелП
14.02.2023, 23:14
Причем здесь, в теме про реле, разговор по плк?

Тема: Создать функцию на ST (https://owen.ru/forum/showthread.php?t=35489&page=54)

Игорюня
15.02.2023, 05:34
Форум * Программируемые устройства ОВЕН * Среда программирования OWEN Logic * Создать функцию на ST

capzap
15.02.2023, 09:00
Тема: Создать функцию на ST (https://owen.ru/forum/showthread.php?t=35489&page=54)

ну так не о плк же речь, а о среде разработки, из которой можно взять исходники и адаптировать в другую среду. И включите логику, для работы с файлами нужен дескриптор, он должен быть запомнен до конца работы с файлом, а функции такой возможностью не обладают, да и нет в ПР разъема для подключения флешек

ПавелП
15.02.2023, 10:17
ну так не о плк же речь, а о среде разработки, из которой можно взять исходники и адаптировать в другую среду. И включите логику, для работы с файлами нужен дескриптор, он должен быть запомнен до конца работы с файлом, а функции такой возможностью не обладают, да и нет в ПР разъема для подключения флешекДействительно чуть промазал. :)

Сижу в двух системах: ПР200 4 шт, и ПЛК110/160...

capzap
15.02.2023, 10:21
и ПЛК110/160...
то что показано на видео это обычная запись строки в конец файла, имя которому что_то_там.csv
И указанием винде что csv файлы открывать екселем

ПавелП
15.02.2023, 11:05
то что показано на видео это обычная запись строки в конец файла, имя которому что_то_там.csv
И указанием винде что csv файлы открывать екселем

Спасибо! :)
Я уже перебрался с этим вопросом, в тему (https://owen.ru/forum/showthread.php?t=27316&p=401276&viewfull=1#post401276) - посмотрю что подскажут.

IVM
30.04.2023, 15:11
ST вариант моего макроса PLA (кусочно-линейная аппроксимация) по мотивам https://owen.ru/forum/showthread.php?t=10555&p=220263&viewfull=1#post220263
график по 10 точкам, метод поиска делением интервала пополам, известный также как двоичный поиск или Дихотомия (https://ru.wikipedia.org/wiki/Дихотомия)

function PLA_ST: real; // (c) PeterA
var_input //объявление входных переменных
x1: real;
x2: real;
x3: real;
x4: real;
x5: real;
x6: real;
x7: real;
x8: real;
x9: real;
x10: real;
y1: real;
y2: real;
y3: real;
y4: real;
y5: real;
y6: real;
y7: real;
y8: real;
y9: real;
y10: real;
In: real;
end_var

var //объявление локальных переменных
a:udint; (*Начало интервала поиска*)
b: udint; (*Конец интервала поиска*)
N: udint; (*Число точек в графике*)
i: udint;
x: array [0..9] of real;
y: array [0..9] of real;
end_var

N:= 10;
x[0]:= x1;
x[1]:= x2;
x[2]:= x3;
x[3]:= x4;
x[4]:= x5;
x[5]:= x6;
x[6]:= x7;
x[7]:= x8;
x[8]:= x9;
x[9]:= x10;

y[0]:= y1;
y[1]:= y2;
y[2]:= y3;
y[3]:= y4;
y[4]:= y5;
y[5]:= y6;
y[6]:= y7;
y[7]:= y8;
y[8]:= y9;
y[9]:= y10;

(*Начальные значения интервала поиска*)
a:=0;
b:=N-1;

(*Обрезание графика для крайних точек*)
IF IN<=x[0] THEN
PLA_ST:=y1;
ELSIF IN>= x[N-1] THEN
PLA_ST:= y[N-1];
(*Теперь можно начать поиск*)
ELSE
WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
i:=(a+b)/2; (*Делим интервал поиска пополам*)
IF IN=x[i+1] THEN (*Может нам повезло, и мы сразу нашли точку? *)
a:=i; b:=i+1; (*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
(*мимо :( ,тогда посмотрим в какую половину интервала попали*)
ELSIF IN>x[i] 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;
(*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
PLA_ST:= y[b] - (x[b] - IN) * (y[b] - y[a]) / (x[b] - x[a]);
END_IF


end_function

58155

petera, зачем такие сложности. Температурный график достаточно прост (см.картинку). Таким образом, достаточно знать координаты двух точек перегиба графика.

Shiryaevo
01.05.2023, 14:17
Добрый вечер! Конечный автомат сделать можно. На входе создаете переменную, например, PrevState. И с помощью "линии задержки" передаете выходное значение Q (UDInt - код шага в автомате) на вход. Таким образом при вызове функция узнает на каком шаге автомата она остановилась в прошлом цикле. Внутри делаете CASE по PrevState и все. Получился такой себе FB с хранением предыдущего состояния "снаружи". Все таймеры внешние. Если шаг =10, то таймер 1 запустить. Таймер через время задержки Т выдает TRUE на вход функции. Управление исполнительными механизмами - по номеру состояний. 5818158182

Интерсное применение рекурсии :)
красиво!

Алексаныч
30.05.2023, 07:13
Здравствуйте. Пишу здесь первый раз. Просто хочется разобраться. У нас на производстве наливают, бочки, кубы, цистерны. И по запросу операторов им нужны переносные пульты для включение и отключение насосов, да еще и реверс. Так как за разумные деньги только ПКТ, но у него два нормально открытых. Сделал систему на ПР. Решил сделать так, чтобы при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался. Пробовал написать несколько программ. Так вот получился у меня интересный случай. Одна функция нормально работает, как я и хотел. Другая не в какую. Кто-нибудь может помочь разобраться? Файл и код прилагаю
Эта функция не работает.

function motorvper: bool; //имя функции и тип данных выхода
var_input //объявление входных переменных
//входная переменная с типом данных bool
vper : bool;
nazad : bool;
puskv : bool;
puskn : bool;
end_var

var //объявление локальных переменных
end_var

if vper=true or puskv=true and nazad=false and puskn=false then motorvper := true;
end_if

if vper=true or nazad=true and puskv=true then motorvper := false ;
end_if

end_function
А эта работает.

function motornazad: bool; //имя функции и тип данных выхода
var_input //объявление входных переменных
vpered : bool;//входная переменная с типом данных bool
nazad : bool;
puskv : bool;
puskn : bool;
end_var

var //объявление локальных переменных
end_var

if nazad=true or puskn=true and vpered=false and puskv=false then motornazad := true;
end_if

if vpered=true or nazad=true and puskn=true then motornazad := false;
end_if

end_function

Cs-Cs
30.05.2023, 08:07
Алексаныч
при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался
Так а если без функции делать? Взять R_TRIG по нажатию на кнопки и AND с выходом насоса? А насосом управлять по RS-триггеру (с приоритетом R)?
То есть, описать условие "Если прошёл импульс наражтия кнопки И насос работает - выключить".

Валенок
30.05.2023, 08:40
Вторые строчки в топку
Сравнение с труе/фальсе в топку
Явные скобки в логических выражениях
И разберетесь

kondor3000
30.05.2023, 08:51
Здравствуйте. Пишу здесь первый раз. Просто хочется разобраться. У нас на производстве наливают, бочки, кубы, цистерны. И по запросу операторов им нужны переносные пульты для включение и отключение насосов, да еще и реверс. Так как за разумные деньги только ПКТ, но у него два нормально открытых. Сделал систему на ПР. Решил сделать так, чтобы при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался. Пробовал написать несколько программ. Так вот получился у меня интересный случай. Одна функция нормально работает, как я и хотел. Другая не в какую. Кто-нибудь может помочь разобраться? Файл и код прилагаю
Эта функция не работает.

У вас в обеих функциях, последние IF одинаковые, а должны быть разные.


// if vper=true or nazad=true and puskv=true then motorvper := false ; //Это ваш код
// end_if

if nazad or vper and puskv then motorvper := false ; // рабочий код
end_if
end_function

И линии задержки сделайте, вместо жёлтых линий
А можно вторые IF вообще выбросить в обеих, тоже работать будет.

Алексаныч
30.05.2023, 10:04
Алексаныч
Так а если без функции делать? Взять R_TRIG по нажатию на кнопки и AND с выходом насоса? А насосом управлять по RS-триггеру (с приоритетом R)?
Да можно. Интересно было написать на ST. Скажем честно я в нем профан и поэтому познаю потихоньку.


У вас в обеих функциях, последние IF одинаковые, а должны быть разные.


// if vper=true or nazad=true and puskv=true then motorvper := false ; //Это ваш код
// end_if
if nazad or vper and puskv then motorvper := false ; // рабочий код
end_if
end_function

И линии задержки сделайте, вместо жёлтых линий
А можно вторые IF вообще выбросить в обеих, тоже работать будет.
Спасибо. Буду дальше разбираться в ST.

kondor3000
30.05.2023, 10:15
Интересно было написать на ST. Скажем честно я в нем профан и поэтому познаю потихоньку.
Спасибо. Буду дальше разбираться в ST.
Можно обе функции записать без IF, по совету Валенка


motorvper:=(vper or puskv and not nazad); // 1 функция

motornazad:=(nazad or puskn and not vpered); // 2 функция

Алексаныч
30.05.2023, 10:54
Можно обе функции записать без IF, по совету Валенка


motorvper:=(vper or puskv and not nazad); // 1 функция

motornazad:=(nazad or puskn and not vpered); // 2 функция

Да если бы он вот так объяснил, было бы намного лучше.
Но походу или я тупой или плохо обрисовал задачу. Если вот так прописать, как в первом варианте(даже с линиями задержки, и без вторых IF) или вариант Валенка. То на симуляции это работает так. На примере команды "Вперед". Подается сигнал на первый выход(пуск двигателя вперед). Если нажать повторно кнопку "Вперед" двигатель остановится. Но вот если вместо кнопки "Вперед", нажать "Назад" двигатель не остановится, а мгновенно включиться сигнал на второй выход(пуск двигателя в реверс). А мне надо, чтобы он остановился и уже при следующем нажатии кнопки оператор может запустить двигатель в нужный момент. Просто у нас растительное масло, а оно способно сделать залипании кнопки.

kondor3000
30.05.2023, 13:44
То на симуляции это работает так. На примере команды "Вперед". Подается сигнал на первый выход(пуск двигателя вперед). Если нажать повторно кнопку "Вперед" двигатель остановится. Но вот если вместо кнопки "Вперед", нажать "Назад" двигатель не остановится, а мгновенно включиться сигнал на второй выход(пуск двигателя в реверс). А мне надо, чтобы он остановился и уже при следующем нажатии кнопки оператор может запустить двигатель в нужный момент. Просто у нас растительное масло, а оно способно сделать залипании кнопки.

Тогда схема будет такой 68069
А первая функция будет так

if vper and not puskn or puskv and not nazad then motorvper := true;
end_if
if nazad or vper and puskv then motorvper := false ;
end_if
end_function

Вторая по аналогии сами попробуйте

Dimensy
30.05.2023, 14:43
Да если бы он вот так объяснил, было бы намного лучше.
Но походу или я тупой или плохо обрисовал задачу. Если вот так прописать, как в первом варианте(даже с линиями задержки, и без вторых IF) или вариант Валенка. То на симуляции это работает так. На примере команды "Вперед". Подается сигнал на первый выход(пуск двигателя вперед). Если нажать повторно кнопку "Вперед" двигатель остановится. Но вот если вместо кнопки "Вперед", нажать "Назад" двигатель не остановится, а мгновенно включиться сигнал на второй выход(пуск двигателя в реверс). А мне надо, чтобы он остановился и уже при следующем нажатии кнопки оператор может запустить двигатель в нужный момент. Просто у нас растительное масло, а оно способно сделать залипании кнопки.

Если сделать вот так, то работает

Сергей0308
30.05.2023, 14:47
Мой вариант с защитой от залипания:

68072

68073

Вот добавил блокировку включения реверса на 5 секунд:

68085

Dimensy
30.05.2023, 14:57
Мой вариант с защитой от залипания:

68072



Ну, хочет человек ST.
Вот мой вариант
68074

capzap
30.05.2023, 15:15
мне надо, чтобы он

странное желание "ловить" события с помощью функции, да и сам алгоритм вызывает сомнения, к примеру если операторы начнут совершать двойные нажатия на кнопки. Автоматизация это же не безусловное использование вычислительной техники в любого рода задачах. Кто будет определять что привод действительно остановился, чтоб только после этого задать другое направление. По хорошему всё же должна быть третья кнопка которая просто останавливает процесс, а вперед и назад должны работать по принципу нажал и забыл, автоматом должна происходить парковка(остановка) и смена направления по единственному нажатию, надеюсь ОС с частотника заведена в контроллер

Алексаныч
31.05.2023, 06:29
Всем спасибо. Разобрался. Для себя подчерпнул много нового. Для переживающего о двойном нажатии и резкой смене движения. Еще ни разу не было обращений. Я же эту систему сначала чисто на блоках сделал. Просто как она выглядит на блоках и как с помощью ST это большая разница и если знать нюансы ST и иметь больше опыта легче в создании вразы. А уж при появлении возможности создать функциональный блок, это можно все в один блок запихать.

capzap
31.05.2023, 07:29
Еще ни разу не было обращений.

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

kaftanati
14.06.2023, 15:50
Вопрос: а когда можно будет вставлять st-функции внутрь ФБ?

Danila Kholkin
23.06.2023, 07:47
Ошибка при Включении отладки и использование блока ST
Подскажите с чем это связанно и как этого избежать


System.ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.
at System.Collections.Generic.List`1.GetRange(Int32 index, Int32 count)
at Owen.ProgrammableRelay.StackBuild.CopyCellsTo(Int3 2 sourceCellIndex, Int32 destCellIndex, Int32 cellsCount)
at ProgramRelayFBD.ApplicationLayer.ST.AnalizeFunctio nElementService.Analize(StFunctionElement element, ProgramCode program, ICompiledFunctionRepository compiledFunctionRepo)
at Owen.General.DomainEvents.RaiseEvent[T](T event, IEnumerable`1 actions)
at ProgramRelayFBD.DomainLayer.OnlineDebugging.Online DebuggingCompilerState.HandleBuildElement(IBuildin gElement element, ProgramCode program, ICompiler compiler)
at Owen.Compiling.ProgramLinker.CompilingElements(Pro gramCode program, IEnumerable`1 elements, CancellationToken cancellationToken)
at ProgramRelayFBD.DomainLayer.Compilers.BaseCompiler .CompilePrograms(ProgramItem programItem, CancellationToken cancellationToken)
at ProgramRelayFBD.DrawingView.<>c__DisplayClass91_0.b__0()
at System.Threading.ExecutionContext.RunFromThreadPoo lDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.Tasks.Task.ExecuteWithThreadLocal (Task& currentTaskSlot, Thread threadPoolThread)

Денисов Максим Сергеевич
23.06.2023, 07:54
Подскажите, какой сценарий возникновения такой ошибки и на какой версии owen logic?

lagutin
23.06.2023, 10:41
А групповой комментарий есть в редакторе? Что то вот так не комментируется /**/.

Dimensy
23.06.2023, 11:00
А групповой комментарий есть в редакторе? Что то вот так не комментируется /**/.

вот так комментируется (* *)

kondor3000
23.06.2023, 11:20
А групповой комментарий есть в редакторе? Что то вот так не комментируется /**/.

А чем вам // не подходит?

wwowa
24.06.2023, 07:16
(* *). Спасибо. Ну иногда нужно и часть кода закомментировать. Одиночным долго. Вот откуда они взяли вот это(* *)? Везде, если погуглить, комментарии в ST /**/.

Dimensy
24.06.2023, 09:04
(* *). Спасибо. Ну иногда нужно и часть кода закомментировать. Одиночным долго. Вот откуда они взяли вот это(* *)? Везде, если погуглить, комментарии в ST /**/.

Погуглил :)
68442

Danila Kholkin
26.06.2023, 07:14
Подскажите, какой сценарий возникновения такой ошибки и на какой версии owen logic?

Версия 2.3.329.0
при включение онлайн отладки и в проекте присутствует блок с написанный на ST возникает такая проблема проверил на другой машине ошибка повторилась . При этом код выполняется корректно, но из-за не возможности отладки пришлось отказаться использовать блоки на ST .

добавил проблемный проект

1exan
26.06.2023, 10:58
Версия 2.3.329.0
при включение онлайн отладки и в проекте присутствует блок с написанный на ST возникает такая проблема проверил на другой машине ошибка повторилась . При этом код выполняется корректно, но из-за не возможности отладки пришлось отказаться использовать блоки на ST .

добавил проблемный проект

Ну для такого расчёта ST не очень то и нужен.
И уж не знаю, как на отладку влияет деление на 0, но лучше всё таки этого избегать

Danila Kholkin
26.06.2023, 14:10
Ну для такого расчёта ST не очень то и нужен.
И уж не знаю, как на отладку влияет деление на 0, но лучше всё таки этого избегать

там нет деления на 0 , я попробовал как работать с ST отладка не работает , выход блока как я понял может быть всего 1 что очень ограничивает функционал

1exan
26.06.2023, 17:57
там нет деления на 0 , я попробовал как работать с ST отладка не работает , выход блока как я понял может быть всего 1 что очень ограничивает функционал

Сейчас нет, а завтра может появиться:
68464

А выход у функции здесь только один, да

Danila Kholkin
27.06.2023, 06:45
Сейчас нет, а завтра может появиться:
68464

А выход у функции здесь только один, да

Спасибо с этим как то справимся. Суть только от этого не меняется не работает у меня отладка при использовании блока с ST . И более сложную фикцию разрабатывать желание отпало

1exan
27.06.2023, 08:33
Спасибо с этим как то справимся. Суть только от этого не меняется не работает у меня отладка при использовании блока с ST . И более сложную фикцию разрабатывать желание отпало

У меня онлайн отладка работает, ошибок нет:
68468

Danila Kholkin
27.06.2023, 13:49
У меня онлайн отладка работает, ошибок нет:
68468

Ну Я имею ввиду не на симуляторе а с реальной ПР200 ?

1exan
27.06.2023, 19:15
Ну Я имею ввиду не на симуляторе а с реальной ПР200 ?

Я и пишу - ОНЛАЙН, на ПР200. Правда модификация не .2 а .5, но вряд-ли существенно

TaPX
30.06.2023, 18:17
Добрый вечер. Подскажите, а можно написать на ST функцию, которая возвращает не одно, а несколько значений?

1exan
30.06.2023, 18:30
Добрый вечер. Подскажите, а можно написать на ST функцию, которая возвращает не одно, а несколько значений?

В ST OwenLodgic - нет (если не считать варианта упаковки нескольких значений в одну переменную)

TaPX
30.06.2023, 23:08
В ST OwenLodgic - нет (если не считать варианта упаковки нескольких значений в одну переменную)

Это типа битовой маски?

1exan
01.07.2023, 08:02
Это типа битовой маски?

Можно как по одному биту упаковывать, так и по 2, 3 и т.д.

Andry_EXO-Space
13.10.2023, 21:07
Здравствуйте!
Я прошу прощения, второй день программирую в Овен лоджик. и у меня вопрос:
А почему код на Паскале? почему не ни Си?
Все известное мне железо до этого прогается на Си...

Dimensy
13.10.2023, 21:23
Здравствуйте!
Я прошу прощения, второй день программирую в Овен лоджик. и у меня вопрос:
А почему код на Паскале? почему не ни Си?
Все известное мне железо до этого прогается на Си...

Потому что МЭК 61131-3

Бакдаулет
18.07.2024, 15:43
здраствуйте я в owen logic не могу создать функцию на st ионка просто не активна что делать 77403

Бакдаулет
18.07.2024, 15:45
И еще вопрос мне поручили задание считать данные с пр100 как это сделать ?

Королев Кирилл
18.07.2024, 16:12
здраствуйте я в owen logic не могу создать функцию на st ионка просто не активна что делать 77403

Уточните, пожалуйста, какой у Вас прибор? Если ПР100, то обращаю Ваше внимание, что создание функций и ФБ на языке ST доступно только для приборов с индексом М02.


И еще вопрос мне поручили задание считать данные с пр100 как это сделать ?

Если речь идет про выгрузку программы из прибора, то такой возможности нет.

Бакдаулет
18.07.2024, 19:21
да пр100 , и можете подсказать что подходит под действие *считать данные с прибора* человек который мне сказал сделать это сам не понимает как

Dimensy
18.07.2024, 19:23
да пр100 , и можете подсказать что подходит под действие *считать данные с прибора* человек который мне сказал сделать это сам не понимает как

Ладно, человек не знает как, но, какие именно данные надо считать с прибора он знает?

З.Ы. Кино и немцы:
- Штурман, приборы
- Двадцать два
- Что, двадцать два?
- А что, приборы?

Бакдаулет
19.07.2024, 09:25
а какие данные можно считывать с пр100?

kondor3000
19.07.2024, 09:34
а какие данные можно считывать с пр100?

У вас проект (исходник), залитый в вашу ПР100 есть?
Если есть, открываете и смотрите какие адреса регистров есть в обмене. Их и можно считать из ПР.

Если вы про считывание проекта, то его считать нельзя. Придётся искать автора проекта или писать проект заново.

EFrol
19.07.2024, 09:38
а какие данные можно считывать с пр100?

Предлагаю почитать инструкцию https://owen.ru/downloads/re_pr100.pdf
начиная со стр. 17
А также ознакомиться с понятием сетевые переменные в https://owen.ru/downloads/rp_owen_logic.pdf

Объяснять это и в правду долго!

Бакдаулет
19.07.2024, 09:45
спасибо больше

shev1975
05.03.2025, 11:06
Здравствуйте, в функциональном блоке нужно изменять значение внешней переменной "Сброс", правильно ли так делать и может есть другие способы? Данный код работает, только при условии что переменная энергонезависимая, иначе ее не получается изменить с "экрана", почему?

Dimensy
05.03.2025, 12:12
Здравствуйте, в функциональном блоке нужно изменять значение внешней переменной "Сброс", правильно ли так делать и может есть другие способы? Данный код работает, только при условии что переменная энергонезависимая, иначе ее не получается изменить с "экрана", почему?

Галку надо поставить на "Запись в конце цикла"
82311

EFrol
05.03.2025, 12:45
Здравствуйте, в функциональном блоке нужно изменять значение внешней переменной "Сброс", правильно ли так делать и может есть другие способы? Данный код работает, только при условии что переменная энергонезависимая, иначе ее не получается изменить с "экрана", почему?

Я использую ФБ exchange для обмена битом между переменными:
82314


function_block exchange

var_input
I : bool;
in : udint;
end_var

var_output
Q : bool;
out : udint;
end_var

if I <> Q then
Q := I; out.0 := I; in.0 := I;
end_if
if in <> out then
out := in; Q := in.0; I := in.0;
end_if

end_function_block


Значение бита видно со всех сторон!

shev1975
05.03.2025, 14:15
Галку надо поставить на "Запись в конце цикла"
Спасибо, понял, получается что если не сделать запись, переменная не сохраняется, а получает значение каждый раз заново.

bayk
23.06.2025, 15:23
Друзья, вы уж простите дурачка, но с поиском на этом форуме справиться не могу. не делал ли кто функцию на ST для вычисления натурального логарифма, ну может и других логарифмов?

petera
23.06.2025, 15:28
Друзья, вы уж простите дурачка, но с поиском на этом форуме справиться не могу. не делал ли кто функцию на ST для вычисления натурального логарифма, ну может и других логарифмов?

Ну как же так?
https://owen.ru/forum/showthread.php?t=37203
84488


function fLb: Real; //Двоичный логарифм
var_input
X:real;
end_var
var
s:real:=0.0;
a:real:=0.5;
i:udint;
b:real;


end_var

//PRG

if X>0 then
if X>=1 then
b:=1;
X:=X;
else
b:=-1;
X:=1/X;
end_if


if x>2 then
s:=udint_to_real( cd32(real_to_udint(x)));
X:=X/ pow(2,s);
end_if;

for i:=0 to 16 do
x:=x*x;
if x>2 then
x:=x/2;
s:=s+a;
end_if;
a:=a*0.5;
end_for
fLb:=s*b;
end_if

end_function

ЗЫ
напомню:если lb(x) - Двоичный логарифм, то
ln(x)=lb(x)/lb(e)=ln(2)*lb(x) = 0,693147*lb(x)
lg(x)=lb(x)/lb(10)=lg(2)*lb(x) = 0,30103*lb(x)

Например

function fLn: Real; //Натуральный логарифм
var_input
X:real;
end_var

//PRG
fLn:=0.6931472*fLb(x); //вызов функции "fLb"
end_function

bayk
23.06.2025, 16:00
спасибо тебе большое! я не знаю как я так...

AlexCrane
24.06.2025, 10:08
Может кто делал разруливатель одновременного запуска на ST? Не хочется изобретать велосипед. Макросы видел, но не устроили (не корректно работали).

WKD
24.06.2025, 13:18
Может кто делал разруливатель одновременного запуска на ST? Не хочется изобретать велосипед. Макросы видел, но не устроили (не корректно работали).
Что понимается под "разруливатель одновременного запуска"?

Сергей0308
24.06.2025, 13:35
Может кто делал разруливатель одновременного запуска на ST? Не хочется изобретать велосипед. Макросы видел, но не устроили (не корректно работали).

Вот здесь разруливали, правда не на ST, в смысле, тогда и ST наверно ещё не было, короче, Вам шашечки или ехать:
https://owen.ru/forum/showthread.php?t=26216&p=432040&viewfull=1#post432040

84503

Настройка минимального периода(как обычно) в свойствах макроса.

И, можно очень легко(практически без усложнения алгоритма) расширить до 32 входов-выходов, в смысле, устройств, которые надо разруливать!

AlexCrane
24.06.2025, 19:39
Вот здесь разруливали, правда не на ST, в смысле, тогда и ST наверно ещё не было, короче, Вам шашечки или ехать:
https://owen.ru/forum/showthread.php?t=26216&p=432040&viewfull=1#post432040

84503

Настройка минимального периода(как обычно) в свойствах макроса.

И, можно очень легко(практически без усложнения алгоритма) расширить до 32 входов-выходов, в смысле, устройств, которые надо разруливать!

Спасибо, эту версию как-то пропустил

Сергей0308
25.06.2025, 21:53
Спасибо, эту версию как-то пропустил

При применении будьте внимательны к настройкам макросов, в смысле, многие(большинство) не обращают на это внимание, поэтому возникают проблемы!

bayk
27.06.2025, 00:51
Вот здесь разруливали, правда не на ST, в смысле, тогда и ST наверно ещё не было, короче, Вам шашечки или ехать:
https://owen.ru/forum/showthread.php?t=26216&p=432040&viewfull=1#post432040

84503

Настройка минимального периода(как обычно) в свойствах макроса.

И, можно очень легко(практически без усложнения алгоритма) расширить до 32 входов-выходов, в смысле, устройств, которые надо разруливать!
Я кстати его нашел, запустил в последнем лоджике, а он почему-то не завелся. Ушел на ст. Ребята из телеги быстренько написали мне код.
При чем когда я его сохранял я точно помню, что его отщелкал и меня все устроило. Я как раз тогда и просил помощи с этим макросом

Сергей0308
27.06.2025, 06:30
Я кстати его нашел, запустил в последнем лоджике, а он почему-то не завелся. Ушел на ст. Ребята из телеги быстренько написали мне код.
При чем когда я его сохранял я точно помню, что его отщелкал и меня все устроило. Я как раз тогда и просил помощи с этим макросом

Я же ссылку дал, в смысле, ничего искать не надо!
В моём проекте всё будет работать с приоритетом у входов-выходов с меньшим числовым значением, если хотите обратный приоритет(у входов-выходов с большим числовым значением) - сделайте настройки двух макросов(субмакросов), входящих в состав макроса в обратном порядке!
Короче, такое впечатление, что Вы либо не читаете что я пишу, либо не понимаете смысла написанного, даже не знаю что хуже!
Ещё раз повторю, мне не сложно: с состав макроса входят два других макроса(субмакроса), если Вы хотите чтобы в вашем проекте макрос работал также как в моём, надо и настройки субмакросов перенести(скопировать), много раз в разных темах об этом писал, даже представить не могу, что здесь может быть непонятным?!
https://owen.ru/forum/showthread.php?t=9398&p=421370&viewfull=1#post421370

bayk
28.06.2025, 09:15
Речь не об этом. Я взял проект который вы когда-то присылали и оно работало, а в свежем лоджике не завелось. Я так и не понял почему. Я не переносил макрос в новый проект.

kondor3000
28.06.2025, 09:59
Речь не об этом. Я взял проект который вы когда-то присылали и оно работало, а в свежем лоджике не завелось. Я так и не понял почему. Я не переносил макрос в новый проект.

Все последние вопросы, давно собраны в одном месте. Ссылку давно бы сохранили.
И логарифмы и выбор одного из нескольких нажатий ( Кто раньше встал, того и тапки на ST )
https://owen.ru/forum/showthread.php?t=37203&page=9&p=429067#81

Сергей0308
28.06.2025, 10:29
Речь не об этом. Я взял проект который вы когда-то присылали и оно работало, а в свежем лоджике не завелось. Я так и не понял почему. Я не переносил макрос в новый проект.

Если Вы основной макрос открываете на редактирование и проверяете алгоритм в симуляции внутри основного макроса, то он будет работать по другому, в смысле, уставка времени минимального периода там будет своя, в смысле, назначенная в свойствах основного макроса не действует, с этим ничего не поделаешь, так у всех макросов будет!

В принципе уставка может даже логику работы менять, например: у меня есть макрос двухпозиционного(релейного) регулятора с настройками режима работы(нагреватель или холодильник) в свойствах макроса:
https://owen.ru/forum/showthread.php?t=26216&p=424807&viewfull=1#post424807

Рогов Алексей
17.11.2025, 11:46
Добрый день!
Если нужны обратные тригонометрические функции и объём в горизонтальном цилиндре - цистерне по высоте жидкости, то прошу ознакомится. Сделано Алисой ИИ.86761