Редактирование пользовательского блока.
Довольно часто готовые пользовательские блоки, созданные под определенные задачи, не совсем подходят для других задач. Нахватает входа Enable, требуется вход вместо параметра, неудобно (не в том порядке) расположены входы/выходы.
Исправить такие мелочи совсем не сложно. Для такого редактирования особых познаний в языках программирования не требуется.
Однако существует еще и психологический фактор – боязнь что-то испортить, сломать. Вот этот враг пострашней всего остального. Его то мы и будем выжигать каленым железом, ну или как говорил Антон Палыч, «выдавливать из себя раба по капле».
Итак, набираемся смелости, кликаем по блоку правой кнопкой мыши и жмем «Редактировать»
.
.
Вход вместо параметра.
Для примера возьмем пользовательский блок RtrigTimer
Все входы, выходы и параметры пользователя это переменные со своими именами.
Все что нам надо сделать это перенести переменную из параметров пользователя во входы блока
.
.
Для этого дважды кликаем на нужном параметре, копируем в буфер имя параметра и запоминаем тип переменной данного параметра.
.
.
После чего закрываем окно редактирования параметра и смело удаляем сам параметр, выделив его и нажав на крестик.
Переходим на вкладку «Входы блока» и жмем на пиктограмму «добавить вход»
.
.
В открывшемся окне вставляем скопированное имя и выставляем тип переменной. После чего жмем «готово».
.
.
Вот в принципе и все. Осталось сохранить наш новый блок. Для этого в основных параметрах изменяем его имя и сохраняем как новый блок.
.
.
Теперь у нас в библиотеке два блока. Один исходный, второй исправленный.
.
.
В результате имеем вот такие блоки.
.
.
Добавление входа Enable
Вход En это тоже переменная типа Boolean. Поэтому первое что мы должны сделать, это создать вход-переменную с таким именем.
.
.
Основной исполнительный код блока находится в секции LoopSection.
Соответственно все что нам надо сделать это создать условие при котором этот код будет выполняться только когда En = 1
Для этого нам потребуется условный оператор if (подробней читай здесь)
В итоге требуется создать следующее дополнение к коду:
if(En==1){
//Здесь весь код из секции LoopSection
}
Для переменных boolean условие принято писать сокращенно:
if(En) соответствует if(En==1)
if(!En) соответствует if(En==0)
Поэтому чаще всего в коде вы встретите следующее написание
if(En){
//Здесь весь код из секции LoopSection
}
В итоге имеем следующее:
.
.
Расположение входов/выходов
Эта глава будет самой короткой, т.к. данная операция осуществляется соответствующими стрелочками. Думаю пояснения здесь излишни.
.
.
Ну и как итог:
.
.
.
Dryundel
Отправлено спустя 3 часа 6 минут 15 секунд:
Дополнение.
(Спасибо Sancho, за напоминание)
Есть один небольшой но важный нюанс при создании входа Enable.
Дело в том, что момент остановки работы блока с помощью входа En может совпасть с моментом когда на выходе Q инициировалась единица (высокий уровень). В этом случае предполагаемый короткий импульс превратится в постоянный сигнал. И хотя в данном случае такая вероятность не велика, все-таки произойти это может. Поэтому, при создании входа En, необходимо позаботится о том, в каком состоянии должны остаться выходы блока. Если выходов несколько, то для каждого следует прописать его состояние после остановки работы блока.
Применительно к нашему блоку RtrigTimer, необходимо сделать так что при остановке его работы входом En, на выходе Q в обязательном порядке должен быть инициирован "0" (низкий уровень).
Другими словами: если на входе En - "1" то код блока работает в штатном режиме, а если на входе En - "0" то на выходе Q - "0"
В коде это будет выглядеть так:
if(En){
if (I) { if (tr2) {tr1 = 0;} else {tr1 = 1; tr2 = 1;} } else {tr1 = 0; tr2 = 0;}
if (tr1) T = millis();
if (millis() - T >= Time && T != 0) { if (tr3) {Q = 0;} else {Q = 1; tr3 = 1;} } else {Q = 0; tr3 = 0;}
}else{
Q = 0;}
Как видим, в коде второе если мы заменили на иначе
И теперь на человеческом языке алгоритм будет выглядеть так:
если на входе En - "1" то код блока работает в штатном режиме, иначе на выходе Q - "0"
Что с точки зрения программирования почти одно и то же.