Фоновая сортировка. https://cloud.mail.ru/public/JBy8/eQz4xByVK
Вид для печати
Фоновая сортировка. 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 - выход.
Порылся, нашёл, посмотрел.
Много всего. Инфы поболее, чем с нуля начинать.
Спасибо! :)
Скалирование на C#, вроде делал когда-то именно с oscat. хотя и не помню уже. Синтаксис примените СТшный.Код: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;
}
Хм. Пролистал внимательно - оч интересно.
Много полезностей, нужное проверил - всё работает.
Прочитал шапку файла, и побродил по ссылкам:
1. 10 лет прошло, часть ссылок оттуда сдохла.
2. ST где-то рядом. Все решения достаточно описаны, но без исходников.
3. У некоторых макросов есть исходные формулы.
4. Винегрет из CFC, ST придётся городить.
Что, впрочем, позволит решить нужные задачи.
Нужен какой нить учебник или справочник по паскалю, с подробно разложенными библиотеками.
ПавелПЕсли речь идёт про OSCAT для CDS 2.3, то его надо не добавить в проект (тогда только шапка видна), а именно открыть как библиотеку. Тогда все исходники видны. Но написаны они ужасно. Без комментариев и с фиг какими именами переменных.Цитата:
Все решения достаточно описаны, но без исходников
Вложение 65842
Надо библиотеку открыть как проект, и скопировать код из блоков.
Привет всем.
Петренко опубликовал с год назад толковый пример
"Овен ПЛК 110-М02 сохранение переменных REAL на USB FLASH в Excel"
но, как всегда, самое интересное утаил... :(
Макрос позволяет указанные переменные писать в лог фай на внешнюю флешку в формате Excel.
Где такое взять? Хоть в текстовый файл.
Есть описание Navigator_PLC_DVD_v3\04. Библиотеки\2022\Описание\OwenLibFileAsync.pdf.
Но там с ходу в 10 листах трудно разобраться.
Тема: Создать функцию на ST
Форум * Программируемые устройства ОВЕН * Среда программирования OWEN Logic * Создать функцию на ST
ну так не о плк же речь, а о среде разработки, из которой можно взять исходники и адаптировать в другую среду. И включите логику, для работы с файлами нужен дескриптор, он должен быть запомнен до конца работы с файлом, а функции такой возможностью не обладают, да и нет в ПР разъема для подключения флешек
Спасибо! :)
Я уже перебрался с этим вопросом, в тему - посмотрю что подскажут.
Здравствуйте. Пишу здесь первый раз. Просто хочется разобраться. У нас на производстве наливают, бочки, кубы, цистерны. И по запросу операторов им нужны переносные пульты для включение и отключение насосов, да еще и реверс. Так как за разумные деньги только ПКТ, но у него два нормально открытых. Сделал систему на ПР. Решил сделать так, чтобы при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался. Пробовал написать несколько программ. Так вот получился у меня интересный случай. Одна функция нормально работает, как я и хотел. Другая не в какую. Кто-нибудь может помочь разобраться? Файл и код прилагаю
Эта функция не работает.
А эта работает.Код: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)?Цитата:
при нажатии любой кнопки "Вперед" или "Назад" при работающем насосе, насос отключался
То есть, описать условие "Если прошёл импульс наражтия кнопки И насос работает - выключить".
Вторые строчки в топку
Сравнение с труе/фальсе в топку
Явные скобки в логических выражениях
И разберетесь
У вас в обеих функциях, последние 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 вообще выбросить в обеих, тоже работать будет.
Да если бы он вот так объяснил, было бы намного лучше.
Но походу или я тупой или плохо обрисовал задачу. Если вот так прописать, как в первом варианте(даже с линиями задержки, и без вторых IF) или вариант Валенка. То на симуляции это работает так. На примере команды "Вперед". Подается сигнал на первый выход(пуск двигателя вперед). Если нажать повторно кнопку "Вперед" двигатель остановится. Но вот если вместо кнопки "Вперед", нажать "Назад" двигатель не остановится, а мгновенно включиться сигнал на второй выход(пуск двигателя в реверс). А мне надо, чтобы он остановился и уже при следующем нажатии кнопки оператор может запустить двигатель в нужный момент. Просто у нас растительное масло, а оно способно сделать залипании кнопки.
Тогда схема будет такой Вложение 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
Мой вариант с защитой от залипания:
Вложение 68072
Вложение 68073
Вот добавил блокировку включения реверса на 5 секунд:
Вложение 68085
Ну, хочет человек ST.
Вот мой вариант
Вложение 68074
странное желание "ловить" события с помощью функции, да и сам алгоритм вызывает сомнения, к примеру если операторы начнут совершать двойные нажатия на кнопки. Автоматизация это же не безусловное использование вычислительной техники в любого рода задачах. Кто будет определять что привод действительно остановился, чтоб только после этого задать другое направление. По хорошему всё же должна быть третья кнопка которая просто останавливает процесс, а вперед и назад должны работать по принципу нажал и забыл, автоматом должна происходить парковка(остановка) и смена направления по единственному нажатию, надеюсь ОС с частотника заведена в контроллер
Всем спасибо. Разобрался. Для себя подчерпнул много нового. Для переживающего о двойном нажатии и резкой смене движения. Еще ни разу не было обращений. Я же эту систему сначала чисто на блоках сделал. Просто как она выглядит на блоках и как с помощью ST это большая разница и если знать нюансы ST и иметь больше опыта легче в создании вразы. А уж при появлении возможности создать функциональный блок, это можно все в один блок запихать.
Вопрос: а когда можно будет вставлять st-функции внутрь ФБ?
Ошибка при Включении отладки и использование блока 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)
Подскажите, какой сценарий возникновения такой ошибки и на какой версии owen logic?