Редактирование пользовательского блока.

Ответить
Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Редактирование пользовательского блока.

#1

Сообщение Dryundel » 25.09.2019{, 18:05}

Редактирование пользовательского блока.

Довольно часто готовые пользовательские блоки, созданные под определенные задачи, не совсем подходят для других задач. Нахватает входа Enable, требуется вход вместо параметра, неудобно (не в том порядке) расположены входы/выходы.
Исправить такие мелочи совсем не сложно. Для такого редактирования особых познаний в языках программирования не требуется.
Однако существует еще и психологический фактор – боязнь что-то испортить, сломать. Вот этот враг пострашней всего остального. Его то мы и будем выжигать каленым железом, ну или как говорил Антон Палыч, «выдавливать из себя раба по капле». :)

Итак, набираемся смелости, кликаем по блоку правой кнопкой мыши и жмем «Редактировать»
.
1.jpg
1.jpg (28.58 КБ) 2037 просмотров
.

Вход вместо параметра.

Для примера возьмем пользовательский блок RtrigTimer
Все входы, выходы и параметры пользователя это переменные со своими именами.
Все что нам надо сделать это перенести переменную из параметров пользователя во входы блока
.
2.jpg
.
Для этого дважды кликаем на нужном параметре, копируем в буфер имя параметра и запоминаем тип переменной данного параметра.
.
3.jpg
.
После чего закрываем окно редактирования параметра и смело удаляем сам параметр, выделив его и нажав на крестик.
Переходим на вкладку «Входы блока» и жмем на пиктограмму «добавить вход»
.
4.jpg
.
В открывшемся окне вставляем скопированное имя и выставляем тип переменной. После чего жмем «готово».
.
5.jpg
.
Вот в принципе и все. Осталось сохранить наш новый блок. Для этого в основных параметрах изменяем его имя и сохраняем как новый блок.
.
6.jpg
.
Теперь у нас в библиотеке два блока. Один исходный, второй исправленный.
.
7.jpg
7.jpg (32.11 КБ) 2037 просмотров
.
В результате имеем вот такие блоки.
.
8.jpg
8.jpg (6.16 КБ) 2037 просмотров
.

Добавление входа Enable


Вход En это тоже переменная типа Boolean. Поэтому первое что мы должны сделать, это создать вход-переменную с таким именем.
.
9.jpg
.
Основной исполнительный код блока находится в секции LoopSection.
Соответственно все что нам надо сделать это создать условие при котором этот код будет выполняться только когда En = 1
Для этого нам потребуется условный оператор if (подробней читай здесь)
В итоге требуется создать следующее дополнение к коду:

if(En==1){
//Здесь весь код из секции LoopSection
}

Для переменных boolean условие принято писать сокращенно:

if(En) соответствует if(En==1)
if(!En) соответствует if(En==0)

Поэтому чаще всего в коде вы встретите следующее написание

if(En){
//Здесь весь код из секции LoopSection
}

В итоге имеем следующее:
.
10.jpg
11.jpg
11.jpg (47.75 КБ) 2037 просмотров
.

Расположение входов/выходов

Эта глава будет самой короткой, т.к. данная операция осуществляется соответствующими стрелочками. Думаю пояснения здесь излишни.
.
12.jpg
.

Ну и как итог:
.
13.jpg
13.jpg (10.07 КБ) 2037 просмотров
. .
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"

Что с точки зрения программирования почти одно и то же. :)
Последний раз редактировалось Dryundel 01.10.2019{, 12:20}, всего редактировалось 2 раза.

Аватара пользователя
belyx
Сержант
Сообщения: 247
Зарегистрирован: 24.07.2016{, 20:38}
Репутация: 20
Откуда: Витебск Беларусь

Редактирование пользовательского блока.

#2

Сообщение belyx » 25.09.2019{, 23:53}

А ещё расширить функционал?
если на входе En - "0" то блок работает без таймера как обычный Rtrig
если на входе En - "1" то блок работает с таймером
а вдруг кому пригодится?

Аватара пользователя
Goosr
Сержант
Сообщения: 184
Зарегистрирован: 07.06.2016{, 08:25}
Репутация: 16
Откуда: Тольятти
Имя: Дмитрий

Редактирование пользовательского блока.

#3

Сообщение Goosr » 26.09.2019{, 08:15}

belyx писал(а):
25.09.2019{, 23:53}
если на входе En - "0" то блок работает без таймера как обычный Rtrig
Ну так для этого есть штатный блок Выделение переднего фронта. :smile198:
FLProg 6.3.1 - 7.3.4 - Linux

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Редактирование пользовательского блока.

#4

Сообщение Dryundel » 26.09.2019{, 08:46}

belyx писал(а):
25.09.2019{, 23:53}
А ещё расширить функционал?
если на входе En - "0" то блок работает без таймера как обычный Rtrig
если на входе En - "1" то блок работает с таймером
а вдруг кому пригодится?
Не вижу в этом смысла. Поставьте Time = 0 и получится обычный Rtrig.

Аватара пользователя
dVo
Рядовой
Сообщения: 23
Зарегистрирован: 03.07.2022{, 20:53}
Репутация: 6
Имя: Владимир

Редактирование пользовательского блока.

#5

Сообщение dVo » 22.10.2022{, 18:42}

Как заменить ПБ целиком, сохранив связи? Например на новую версию.

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

Редактирование пользовательского блока.

#6

Сообщение Phazz » 22.10.2022{, 18:52}

Ни как к сожалению

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Редактирование пользовательского блока.

#7

Сообщение aidar_i » 22.10.2022{, 19:36}

Если приходится создавать вход String из параметра, а в блоке в коде он в char array применяется, нужно String превратить в char array.
Dryundel, про это напиши с примерами красиво, как умеешь.
В начале , когда я начинал создавать блоки, это для меня был большим препятствием, здесь никто мне не ответил, как это сделать, пока я сам не нашел как это сделать.

Ответить

Вернуться в «Обучающие примеры работы в FLProg»