Владимир, как заключить в оператор IF кусок ранее написанного кода ? При вводе IF сразу формируется пустое тело оператора. Если убрать END_IF, убирается весь оператор.
Вид для печати
Владимир, как заключить в оператор IF кусок ранее написанного кода ? При вводе IF сразу формируется пустое тело оператора. Если убрать END_IF, убирается весь оператор.
ctrl+shift+стрелки вверх/вниз будут перемещать операторы (либо текущую команду, либо блок выделенных команд)
Например:
пишем if -- появляется пустой блок if
выделяем код, который хотим внести в этот самый IF
дальше жмём ctrl+shift+вверх/вниз до тех пор, пока код не переместится внутрь IF'а
А операций деление, умножение вроде как нет ?
Почему компилятору не нравится такая конструкция ?
https://hardella.com/docs/pru/featur...ограммирования
Цитата:
* Не поддерживаются сложные выражения. Т.е. чтобы записать d := a+b-c нужно делать промежуточную переменную и записывать как u := b-c; d:= a+b;. При этом не стоит думать, что “использование одной временной переменной” сократит используемые ресурсы. Если использовать разные переменные, то компилятор сможет понять, когда одна из них становится ненужной.
* В условных операторах (IF, WHILE, REPEAT) составные AND, OR работают, но тоже не в любых комбинациях. Если скомпилировалось, то норм. Если “не поддерживается”, то будет ошибка компиляции.
Владимир, что такое ваш эмулятор и как им пользоваться ?
Это библиотека на java. Нужно писать программы типа таких: https://github.com/vlsi/pru-emulator...t.java#L27-L29
ctrl+A – это сочетание открывает окно, в котором можно найти все остальные сочетания.
Владимир, у меня это не работает.
Ctrl+C, Ctrl+V у меня не работает.
На сайте написано не Ctrl+shift+A, а ctrl+A.
ctrl+A – это сочетание открывает окно, в котором можно найти все остальные сочетания - вот так написано.
Владимир, в последней версии Hardella чтение и запись переменных при обмене с программой CoDeSys разделены. Что в связи с этим должно поменяется в тексте программы в Hardella ?
Владимир как зачать, то что на первой картинке? Чем первое отличается от второго ?
Владимир, что за холера прицепилась и не отстает.
А как пробовали?
Либо через клавишу @, либо alt+enter -> exchange with host, либо мышкой по лампочке и снова echange with host, либо чуть-чуть подождать и мышкой справа на варианте exchange with host.
4 варианта.
Вот пример: http://recordit.co/ctJyTr3c3r
Проблемный пример в студию.
Вот на примере TON'а: http://recordit.co/GhbZbjC4hV
Владимир, сколько переменных типа DWORD можно объявить в программе PRU ?
Штук 30.
Но всё зависит от того, сколько из них реально используются.
Например, в следующем коде "используются 3 DWORD переменные", но в результирующей PRU программе используется только 4 байта из регистровой памяти.
Код:a,b,c:DWORD;
a:=1;
b:=a+1; (* на этом этапе значение a уже не нужно и по факту, "b" размещается в той же ячейке, что и "a" *)
c:=b+1; (* аналогично, "c" размещается в той же ячейке, что и "b" *)
(* далее чтений переменных "a" и "b" нет *)
Т.е. если нужна переменная для временных вычислений в одном конкретном месте, то лучше взять и объявить эту самую переменную.
Компилятор должен понять, что после этих временных вычислений значение больше не используется, и сможет переиспользовать этот регистр.
Если же для всех промежуточных вычислений использовать одну-единственную переменную, то компилятор наглухо зарезервирует регистр за этой переменной, хотя он и нужен только эпизодически.
Владимир, вы в ФБ Steper корректировку частоты (периода) делаете в каждом такте ?
В нашем полку прибыло. Отлично. Вместе нам будет веселей. Я тут тоже озадачен решением нетривиальной задачи по управлению ШД.
Я в Hardella делаю свой ФБ для непрерывного регулирования частоты вращения ротора ШД. У меня вот такая формула для расчета текущего значения периода получилась: T = T0/(1+T0*a*t);
Тут присутствует операция деления и это мне не нравится. Владимир, что можете посоветовать ?
А обязательно ли корректировать каждую микросекунду?
Можно раз в 100мкс обновлять "новую цель" и чтобы PRU шпарило к ней.
Либо просто "раз в 100мкс вычислять новый интервал между импульсами", либо "раз в 100мкс вычислять новый интервал + прибавку к нему". При этом PRU будет каждые 100мкс получать более-менее правильные значения, а между делом линейно наращивать/сокращать интервал на полученное же значение.
Тогда деление в PRU не понадобится, а достаточно будет простого t1 := t1+dt;
Вот исходная формула: T = T0/(1+T0*a*t);, ее можно привести к виду: T = T0 + ΣdT.
T0 - текущий период известен, t - время разгона/торможения известно (изначально жестко задано), n - количество тактов известно (т.к. t известно), dT - приращение на каждом такте известно. Т.е. на каждом такте прибавляем к T0 накопленную сумму, суммируем от 0 до n. В основной программе один раз раcчитывается и передается в PRU dT и n
"Проблема" в том, что для правильной физики процесса формула должна быть не для задержек, а для частоты.
Т.е. частота должна расти линейно, а задержки будут расти как разница корней.
Другое дело, что если обновлять T0 раз в 100мкс, то никто не заметит подлога и наверняка будет всех устраивать.
PS. В моём блоке PRU_STEPPER реализована корректировка длительности каждого импульса только из-за того, что так было _проще_ сделать. Да, да. Именно проще всю программу написать в PRU, т.к. тогда её гораздо проще отлаживать. По крайней мере мне. Запускаешь на эмуляторе и всё видишь.
Если же делать половину программы в "100мкс таймере" и "половину в PRU", то отлаживать становится сложнее, т.к. у меня нет "эмулятора КДС кода".
Например: в КДС программе можно и нужно использовать нормальные деления REAL'ов. А мой эмулятор делался для PRU, в котором дробных вообще нет.