Просмотр полной версии : Создать функцию на ST
Наверное, выходит, к целым нельзя пока применять побитовые операции
Когда нельзя, но очень хочется, то ... ;)
64963
64964
При этом если не ошибаюсь можно использовать просто AND без всякого ST
Сергей0308
30.12.2022, 12:28
При этом если не ошибаюсь можно использовать просто AND без всякого ST
Говорят, что уже нельзя!
Тогда мне непонятно как работают ранее сделанные проекты, у меня практически в каждом проекте такое используется!
Матерюсь, при отсутствии прибора и выбора COM порт программа ТУПИТ безбожно, разработчики, почините что ли...
Можно вроде, версия 2.ххх
Можно вроде, версия 2.ххх
Ни чего что тема про ST
capzap речь о том, что почему-то на ST не реализован AND с целочисленными в виде простого & , хотя в FB он работает.
Филоненко Владислав
31.12.2022, 22:18
capzap речь о том, что почему-то на ST не реализован AND с целочисленными в виде простого & , хотя в FB он работает.
Потому что это язык ST, а не C
Филоненко Владислав С наступившим вас Новым(текущим) Годом :)
Как коня не назови, & или AND OR NOT, а ехать оно не хочет, судя по предыдущей странице.... при этом поставив кубик AND все работает как и задумано
Включение и выключение насосов. Возможность вывода в ремонт. Общее число насосов можно задать вверху холста. В общем то в этом и был весь смысл. Аварии не реализованы, но это уже детали.
Чисто эксперимент.https://disk.yandex.ru/d/9A0zyGGd2R9Wwg
Решил сделать сортировку. Объясните мне, что значит переменная udint 4 байта? Это я так понимаю что это 32 веса от 0 до 31... По справке это максимальное число 4*294*967*295. По калькулятору это 32 единички.. Все сходится. Но при попытке присвоить значение функции f.31:= true пишет ошибку "или маленькое или большое число"(это мой перевод:rolleyes:).
Объясните, где я не догоняю то???https://disk.yandex.ru/d/043NgOt7q9Ercg
Пробовали присвоить единицу?
Решил сделать сортировку. Объясните мне, что значит переменная udint 4 байта? Это я так понимаю что это 32 веса от 0 до 31... По справке это максимальное число 4*294*967*295. По калькулятору это 32 единички.. Все сходится. Но при попытке присвоить значение функции f.31:= true пишет ошибку "или маленькое или большое число"(это мой перевод:rolleyes:).
Объясните, где я не догоняю то???https://disk.yandex.ru/d/043NgOt7q9Ercg
Похоже еще один косяк ST обнаружился
Похоже еще один косяк ST обнаружился
у Вас тоже проявляется ошибка? Как она выглядит скрином покажите 65033
у Вас тоже проявляется ошибка? Как она выглядит скрином покажите 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
У меня не работает никак. Как бы я пытался что то присвоить 31 биту - сразу ошибка. И при прибавлении 2147483648 - тоже....
Это сторожевой бит)) какой то.
Вот еще цикл. Написано в справке везде во всех позициях в цикле выражения. Но вот так
for i := 0 to i<8 do тоже не дает. Говорит на месте i<8 должно быть целое. Наверное, урезали криво.
И обратится к биту по переменной тоже не дает f.var:= true -нельзя....
И без отладки тоже беда.:o Ну можно в кодесис наваять и отладить, а тут получится и то нельзя и то....
Но как то массивы есть, а какой то ерунды нет или глючит? ну как это так то????
"ps" содесис позволяет обратится к 31 биту
65039
ну раз появились проблемы с 31 разрядом, значит начались некие работы по использованию отрицательных целочисленных
65042
На "от нуля до пока меньше 8" чё должна сказать ?
Должна провести цикл от нуля до 7... Это очень удобно, особенно при работе с массивами и прочими.
Как то так
for (var i = 0; i < items.length - 1; i++)
Ошибок на порядок уменьшается. Но в ST нет. Ну нет и нет...Чего уж тут теперь.
А что у вас присваивается 31 бит, а у меня нет - это еще хуже. У кого работает, у кого нет. Стабильности нет. В мире стабильности нет, в лоджике нет. Перебор, однако:o
Здравствуйте! Вот такой вопрос. Два вложенных цикла. При переборе до 2500 - пишет бесконечный цикл. При 1000 уже считает все. А на основании каких данных цикл считается бесконечным, или он уложится в цикл программы. В содесис, насколько я почитал и понял есть сторожевой таймер. А здесь как то просчитать можно?
Фоновая сортировка. https://cloud.mail.ru/public/JBy8/eQz4xByVK
Привет всем!
Делал кто "перевод" макросов на язык 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 - выход.
Привет всем!
Делал кто "перевод" макросов на язык ST ?
Иногда надо подправить малость - мне проще в ST. :)
Вот попробовал с ходу перевести:
Преобразователь диапазона с ограничением SCALE.
Получаются разные результаты...[B]
установите КДС, воспользуйтесь одноименной библиотекой на oscat.de, там все функции на языке ST, адаптировать их под ОЛ куда проще чем с квадратиков переводить
установите КДС, воспользуйтесь одноименной библиотекой на oscat.de, там все функции на языке ST, адаптировать их под ОЛ куда проще чем с квадратиков переводить
Порылся, нашёл (https://ftp.owen.ru/CoDeSys3/98_Books/oscat_basic333_ru.pdf), посмотрел.
Много всего. Инфы поболее, чем с нуля начинать.
Спасибо! :)
Макросы уже есть на ST ?
Все REAL ?
математики, ля
прогеры, ля
постановщики задач, ля
:)
Первый раз, в первый класс...
Дали люди ссылку, будет поболее инфы, и меньше вопросов!
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. хотя и не помню уже. Синтаксис примените СТшный.
Макросы уже есть на ST ?
Все REAL ?
математики, ля
CompareADC := (InADCa - InMIN) / (InMAX - InMIN) * (UotMAX - UotMin) + UotMin
[/CODE]
Всё работает!!! Совпадает с эталоном.
Спасибо! :)
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. хотя и не помню уже. Синтаксис примените СТшный.
Подошло.
Только контроль пределов не нужен.
Раз оттарировал, и заработало!
Спасибо! :)
установите КДС, воспользуйтесь одноименной библиотекой на oscat.de, там все функции на языке ST, адаптировать их под ОЛ куда проще чем с квадратиков переводить
Хм. Пролистал внимательно - оч интересно.
Много полезностей, нужное проверил - всё работает (https://ftp.owen.ru/CoDeSys3/98_Books/oscat_basic333_ru.pdf).
Прочитал шапку файла, и побродил по ссылкам:
1. 10 лет прошло, часть ссылок оттуда сдохла.
2. ST где-то рядом. Все решения достаточно описаны, но без исходников.
3. У некоторых макросов есть исходные формулы.
4. Винегрет из CFC, ST придётся городить.
Что, впрочем, позволит решить нужные задачи.
Нужен какой нить учебник или справочник по паскалю, с подробно разложенными библиотеками.
ПавелП
Все решения достаточно описаны, но без исходников Если речь идёт про OSCAT для CDS 2.3, то его надо не добавить в проект (тогда только шапка видна), а именно открыть как библиотеку. Тогда все исходники видны. Но написаны они ужасно. Без комментариев и с фиг какими именами переменных.
65842
kondor3000
11.02.2023, 11:42
Надо библиотеку открыть как проект, и скопировать код из блоков.
ПавелП Если речь идёт про OSCAT для CDS 2.3, то его надо не добавить в проект (тогда только шапка видна), а именно открыть как библиотеку. Тогда все исходники видны. Но написаны они ужасно. Без комментариев и с фиг какими именами переменных.
65842
Выходные. Посмотрел повнимательнее.
Вообще-то, если назначение и алгоритм понятные, то
в простых макросах разобраться можно.
Но есть монстры очень сложные.
Но они то и не очень нужны. :)
Надо библиотеку открыть как проект, и скопировать код из блоков.
Всё так. Я про комментарии.
Всё заметно упрощается, когда есть возможность
не "сидеть" в рамках макроса, а подкрутить его в свою сторону. :)
Привет всем.
Петренко опубликовал с год назад толковый пример (http://www.youtube.com/watch?v=Q6ETFE6dr4g)
"Овен ПЛК 110-М02 сохранение переменных REAL на USB FLASH в Excel"
но, как всегда, самое интересное утаил... :(
Макрос позволяет указанные переменные писать в лог фай на внешнюю флешку в формате Excel.
Где такое взять? Хоть в текстовый файл.
Есть описание Navigator_PLC_DVD_v3\04. Библиотеки\2022\Описание\OwenLibFileAsync.pdf.
Но там с ходу в 10 листах трудно разобраться.
Привет всем.
Петренко опубликовал с год назад толковый пример (http://www.youtube.com/watch?v=Q6ETFE6dr4g)
"Овен ПЛК 110-М02 сохранение переменных REAL на USB FLASH в Excel"
но, как всегда, самое интересное утаил... :(
Макрос позволяет указанные переменные писать в лог фай на внешнюю флешку в формате Excel.
Где такое взять? Хоть в текстовый файл.
Есть описание Navigator_PLC_DVD_v3\04. Библиотеки\2022\Описание\OwenLibFileAsync.pdf.
Но там с ходу в 10 листах трудно разобраться.
Причем здесь, в теме про реле, разговор по плк?
Причем здесь, в теме про реле, разговор по плк?
Тема: Создать функцию на ST (https://owen.ru/forum/showthread.php?t=35489&page=54)
Форум * Программируемые устройства ОВЕН * Среда программирования OWEN Logic * Создать функцию на ST
Тема: Создать функцию на ST (https://owen.ru/forum/showthread.php?t=35489&page=54)
ну так не о плк же речь, а о среде разработки, из которой можно взять исходники и адаптировать в другую среду. И включите логику, для работы с файлами нужен дескриптор, он должен быть запомнен до конца работы с файлом, а функции такой возможностью не обладают, да и нет в ПР разъема для подключения флешек
ну так не о плк же речь, а о среде разработки, из которой можно взять исходники и адаптировать в другую среду. И включите логику, для работы с файлами нужен дескриптор, он должен быть запомнен до конца работы с файлом, а функции такой возможностью не обладают, да и нет в ПР разъема для подключения флешекДействительно чуть промазал. :)
Сижу в двух системах: ПР200 4 шт, и ПЛК110/160...
и ПЛК110/160...
то что показано на видео это обычная запись строки в конец файла, имя которому что_то_там.csv
И указанием винде что csv файлы открывать екселем
то что показано на видео это обычная запись строки в конец файла, имя которому что_то_там.csv
И указанием винде что csv файлы открывать екселем
Спасибо! :)
Я уже перебрался с этим вопросом, в тему (https://owen.ru/forum/showthread.php?t=27316&p=401276&viewfull=1#post401276) - посмотрю что подскажут.
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
Алексаныч
при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался
Так а если без функции делать? Взять R_TRIG по нажатию на кнопки и AND с выходом насоса? А насосом управлять по RS-триггеру (с приоритетом R)?
То есть, описать условие "Если прошёл импульс наражтия кнопки И насос работает - выключить".
Вторые строчки в топку
Сравнение с труе/фальсе в топку
Явные скобки в логических выражениях
И разберетесь
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
Вторая по аналогии сами попробуйте
Да если бы он вот так объяснил, было бы намного лучше.
Но походу или я тупой или плохо обрисовал задачу. Если вот так прописать, как в первом варианте(даже с линиями задержки, и без вторых IF) или вариант Валенка. То на симуляции это работает так. На примере команды "Вперед". Подается сигнал на первый выход(пуск двигателя вперед). Если нажать повторно кнопку "Вперед" двигатель остановится. Но вот если вместо кнопки "Вперед", нажать "Назад" двигатель не остановится, а мгновенно включиться сигнал на второй выход(пуск двигателя в реверс). А мне надо, чтобы он остановился и уже при следующем нажатии кнопки оператор может запустить двигатель в нужный момент. Просто у нас растительное масло, а оно способно сделать залипании кнопки.
Если сделать вот так, то работает
Сергей0308
30.05.2023, 14:47
Мой вариант с защитой от залипания:
68072
68073
Вот добавил блокировку включения реверса на 5 секунд:
68085
Мой вариант с защитой от залипания:
68072
Ну, хочет человек ST.
Вот мой вариант
68074
мне надо, чтобы он
странное желание "ловить" события с помощью функции, да и сам алгоритм вызывает сомнения, к примеру если операторы начнут совершать двойные нажатия на кнопки. Автоматизация это же не безусловное использование вычислительной техники в любого рода задачах. Кто будет определять что привод действительно остановился, чтоб только после этого задать другое направление. По хорошему всё же должна быть третья кнопка которая просто останавливает процесс, а вперед и назад должны работать по принципу нажал и забыл, автоматом должна происходить парковка(остановка) и смена направления по единственному нажатию, надеюсь ОС с частотника заведена в контроллер
Алексаныч
31.05.2023, 06:29
Всем спасибо. Разобрался. Для себя подчерпнул много нового. Для переживающего о двойном нажатии и резкой смене движения. Еще ни разу не было обращений. Я же эту систему сначала чисто на блоках сделал. Просто как она выглядит на блоках и как с помощью ST это большая разница и если знать нюансы ST и иметь больше опыта легче в создании вразы. А уж при появлении возможности создать функциональный блок, это можно все в один блок запихать.
Еще ни разу не было обращений.
убойный аргумент, туше. Может и не жалуются потому что видят в Вас авторитет, из галетника на три положения сделать целую систему на контроллере это круто
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?
А групповой комментарий есть в редакторе? Что то вот так не комментируется /**/.
А групповой комментарий есть в редакторе? Что то вот так не комментируется /**/.
вот так комментируется (* *)
kondor3000
23.06.2023, 11:20
А групповой комментарий есть в редакторе? Что то вот так не комментируется /**/.
А чем вам // не подходит?
(* *). Спасибо. Ну иногда нужно и часть кода закомментировать. Одиночным долго. Вот откуда они взяли вот это(* *)? Везде, если погуглить, комментарии в ST /**/.
(* *). Спасибо. Ну иногда нужно и часть кода закомментировать. Одиночным долго. Вот откуда они взяли вот это(* *)? Везде, если погуглить, комментарии в ST /**/.
Погуглил :)
68442
Danila Kholkin
26.06.2023, 07:14
Подскажите, какой сценарий возникновения такой ошибки и на какой версии owen logic?
Версия 2.3.329.0
при включение онлайн отладки и в проекте присутствует блок с написанный на ST возникает такая проблема проверил на другой машине ошибка повторилась . При этом код выполняется корректно, но из-за не возможности отладки пришлось отказаться использовать блоки на ST .
добавил проблемный проект
Версия 2.3.329.0
при включение онлайн отладки и в проекте присутствует блок с написанный на ST возникает такая проблема проверил на другой машине ошибка повторилась . При этом код выполняется корректно, но из-за не возможности отладки пришлось отказаться использовать блоки на ST .
добавил проблемный проект
Ну для такого расчёта ST не очень то и нужен.
И уж не знаю, как на отладку влияет деление на 0, но лучше всё таки этого избегать
Danila Kholkin
26.06.2023, 14:10
Ну для такого расчёта ST не очень то и нужен.
И уж не знаю, как на отладку влияет деление на 0, но лучше всё таки этого избегать
там нет деления на 0 , я попробовал как работать с ST отладка не работает , выход блока как я понял может быть всего 1 что очень ограничивает функционал
там нет деления на 0 , я попробовал как работать с ST отладка не работает , выход блока как я понял может быть всего 1 что очень ограничивает функционал
Сейчас нет, а завтра может появиться:
68464
А выход у функции здесь только один, да
Danila Kholkin
27.06.2023, 06:45
Сейчас нет, а завтра может появиться:
68464
А выход у функции здесь только один, да
Спасибо с этим как то справимся. Суть только от этого не меняется не работает у меня отладка при использовании блока с ST . И более сложную фикцию разрабатывать желание отпало
Спасибо с этим как то справимся. Суть только от этого не меняется не работает у меня отладка при использовании блока с ST . И более сложную фикцию разрабатывать желание отпало
У меня онлайн отладка работает, ошибок нет:
68468
Danila Kholkin
27.06.2023, 13:49
У меня онлайн отладка работает, ошибок нет:
68468
Ну Я имею ввиду не на симуляторе а с реальной ПР200 ?
Ну Я имею ввиду не на симуляторе а с реальной ПР200 ?
Я и пишу - ОНЛАЙН, на ПР200. Правда модификация не .2 а .5, но вряд-ли существенно
Добрый вечер. Подскажите, а можно написать на ST функцию, которая возвращает не одно, а несколько значений?
Добрый вечер. Подскажите, а можно написать на ST функцию, которая возвращает не одно, а несколько значений?
В ST OwenLodgic - нет (если не считать варианта упаковки нескольких значений в одну переменную)
В ST OwenLodgic - нет (если не считать варианта упаковки нескольких значений в одну переменную)
Это типа битовой маски?
Это типа битовой маски?
Можно как по одному биту упаковывать, так и по 2, 3 и т.д.
Andry_EXO-Space
13.10.2023, 21:07
Здравствуйте!
Я прошу прощения, второй день программирую в Овен лоджик. и у меня вопрос:
А почему код на Паскале? почему не ни Си?
Все известное мне железо до этого прогается на Си...
Здравствуйте!
Я прошу прощения, второй день программирую в Овен лоджик. и у меня вопрос:
А почему код на Паскале? почему не ни Си?
Все известное мне железо до этого прогается на Си...
Потому что МЭК 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 , и можете подсказать что подходит под действие *считать данные с прибора* человек который мне сказал сделать это сам не понимает как
да пр100 , и можете подсказать что подходит под действие *считать данные с прибора* человек который мне сказал сделать это сам не понимает как
Ладно, человек не знает как, но, какие именно данные надо считать с прибора он знает?
З.Ы. Кино и немцы:
- Штурман, приборы
- Двадцать два
- Что, двадцать два?
- А что, приборы?
Бакдаулет
19.07.2024, 09:25
а какие данные можно считывать с пр100?
kondor3000
19.07.2024, 09:34
а какие данные можно считывать с пр100?
У вас проект (исходник), залитый в вашу ПР100 есть?
Если есть, открываете и смотрите какие адреса регистров есть в обмене. Их и можно считать из ПР.
Если вы про считывание проекта, то его считать нельзя. Придётся искать автора проекта или писать проект заново.
а какие данные можно считывать с пр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
Здравствуйте, в функциональном блоке нужно изменять значение внешней переменной "Сброс", правильно ли так делать и может есть другие способы? Данный код работает, только при условии что переменная энергонезависимая, иначе ее не получается изменить с "экрана", почему?
Здравствуйте, в функциональном блоке нужно изменять значение внешней переменной "Сброс", правильно ли так делать и может есть другие способы? Данный код работает, только при условии что переменная энергонезависимая, иначе ее не получается изменить с "экрана", почему?
Галку надо поставить на "Запись в конце цикла"
82311
Здравствуйте, в функциональном блоке нужно изменять значение внешней переменной "Сброс", правильно ли так делать и может есть другие способы? Данный код работает, только при условии что переменная энергонезависимая, иначе ее не получается изменить с "экрана", почему?
Я использую ФБ 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
Галку надо поставить на "Запись в конце цикла"
Спасибо, понял, получается что если не сделать запись, переменная не сохраняется, а получает значение каждый раз заново.
Друзья, вы уж простите дурачка, но с поиском на этом форуме справиться не могу. не делал ли кто функцию на ST для вычисления натурального логарифма, ну может и других логарифмов?
Друзья, вы уж простите дурачка, но с поиском на этом форуме справиться не могу. не делал ли кто функцию на 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
спасибо тебе большое! я не знаю как я так...
AlexCrane
24.06.2025, 10:08
Может кто делал разруливатель одновременного запуска на ST? Не хочется изобретать велосипед. Макросы видел, но не устроили (не корректно работали).
Может кто делал разруливатель одновременного запуска на 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
Спасибо, эту версию как-то пропустил
При применении будьте внимательны к настройкам макросов, в смысле, многие(большинство) не обращают на это внимание, поэтому возникают проблемы!
Вот здесь разруливали, правда не на 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
Речь не об этом. Я взял проект который вы когда-то присылали и оно работало, а в свежем лоджике не завелось. Я так и не понял почему. Я не переносил макрос в новый проект.
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
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot