FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Среда, 07.12.2016, 11:35
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » for() to, для пользовательского блока (как сделать?)
for() to, для пользовательского блока
VirSpy
Дата: Вторник, 08.03.2016, 14:40 | Сообщение # 1
Сержант
Группа: Проверенные
Сообщений: 55
Награды: 3
Репутация: 0
Статус: Offline
...не знаю, как описать мысли. из курса ZXBasic что-то припоминается...
Суть: при определенном условии (например, и далее в кавычках, - при поступлении данных с КОМпорта) запустить пользовательский блок. Он, в свою очередь, выполняется (сверка принятых данных с массивом), пока не будут достигнуты - А: конец цикла (нет совпадений), Б: условие выхода (есть совпадение с Н элементом). Ну и соответственно на выходе блока имеем bА, bБ и iН . Только после продолжаем выполнение основной программы.
Спасибо.


Сообщение отредактировал VirSpy - Вторник, 08.03.2016, 14:41
 
Олег Дата: Вторник, 08.03.2016, 16:12 | Сообщение # 2
Гуру
Группа: Проверенные
Сообщений: 729
Награды: 20
Репутация: 15
Статус: Offline
В новой версии программы появился вход En для пользовательских блоков FBD или LD, ну а внутри блока компаратор. Если я правильно понял что вы хотите.
 
VirSpy Дата: Вторник, 08.03.2016, 21:50 | Сообщение # 3
Сержант
Группа: Проверенные
Сообщений: 55
Награды: 3
Репутация: 0
Статус: Offline
Не пойму, как зациклить середину блока, и как пропускать весь блок при En=0. На Бейсике начала 90х это выглядело гдето так

89 ...
90 if En=0 to goto 100
91    let Cycl=0
92         if Cycl=9 to goto 99
93                ...
...                     "проверка массива"
97          let Cycl=Cycl+1
98         goto 92
99    let x=   "выводим результат"
100 ...   "продолжаем прогу"
Прикрепления: 2222-FBD-.ubi(333Kb)
 
TVG Дата: Вторник, 08.03.2016, 21:56 | Сообщение # 4
Сержант
Группа: Проверенные
Сообщений: 47
Награды: 0
Репутация: 1
Статус: Offline
Помоему  это все можно нарисовать не на коде си а блоками там для этого всего есть блоки (бейсик довольно сильно отличеатся от си) а главно продумать алгоритм :))
у вас уже нарисован блок пользователя что то я не совсем понял что вам еще нужно ?


Сообщение отредактировал TVG - Вторник, 08.03.2016, 22:09
 
Олег Дата: Вторник, 08.03.2016, 23:57 | Сообщение # 5
Гуру
Группа: Проверенные
Сообщений: 729
Награды: 20
Репутация: 15
Статус: Offline
Вы просто объясните что вы хотите словами, мне например бэйсик неведом.
 
SirYorik Дата: Среда, 09.03.2016, 12:09 | Сообщение # 6
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
что такое "проверка массива"? от этого зависит вид решения (бейсик то я понял)


Цитата
А: конец цикла (нет совпадений), Б: условие выхода (есть совпадение с Н элементом).

вообще у автора есть видеоурок по использованию массивов в обработке потока с ком-порта

Добавлено (09.03.2016, 12:09)
---------------------------------------------
по моему похоже на ваше хотение

эта схема


делает такой код:

Цитата
int _FLPArray155448289[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int _gtv1 = 7; //этонайти
int _gtv2 = 0; //найденный индекс
void setup()
{
}
void loop()
{
if (((_findElementFromIntegerArray(_FLPArray155448289, 10, (_gtv1))) > -1)) {
_gtv2 = (_findElementFromIntegerArray(_FLPArray155448289, 10, (_gtv1)));
}
}
int _findElementFromIntegerArray(int array[], int arraySize, int value) {
for (int i = 0; i < arraySize; i = i + 1) {
if (array == value) {
return i;
}
}
return -1;
}
Прикрепления: 5333523.jpg(15Kb)


Сообщение отредактировал SirYorik - Среда, 09.03.2016, 12:10
 
VirSpy Дата: Пятница, 11.03.2016, 20:08 | Сообщение # 7
Сержант
Группа: Проверенные
Сообщений: 55
Награды: 3
Репутация: 0
Статус: Offline
Попытаюсь описать на FLProg так:

Плата N-1: основная прога
Плата 56: идет сравнение (условие), если =1, то перейти на плату 60  , иначе далее
Плата 57: обработка данных
Плата 58: сравнение данных, если =0, то перейти на плату 56 , иначе записать данные в переменную и продолжить с п60
Плата 60(N+1): продолжение основной проги

Другой вариант: устранение дребезга на резистивной клавиатуре. На сколько понимаю, без Си невозможно зациклить плату.:-

31.......прога....
32 прочитать значение порта =в А0
33 если А0 равен 1023 (кнопки не нажаты), перейти на 40
34 иначе: записать значение порта в Аt(emp)
35 сравнить: A0 равно At, значит перейти на строку38
36 иначе: перейти на строку 34 и выполнять это в течении (100 миллисекунд)
38 вывести значения Аt
40 .....продолжение проги.....

Еще раз повторюсь: в программировании я пасс (помню только Бейсик а-ля конца 80-х) По аналогии могу читать на Си, но не могу понять архитектуру как таковую и т.д., т.п. построения, в основном самого принципа написания прог на Си (почему здесь, а не там, зачем повторять, объявлять здесь...). Создавая проекты, я их пишу по-этапно, записывая каждую измененную версию, и просматривая код в Си, вижу изменения и понимаю что-как. Но это в основном 30-40%
 
SirYorik Дата: Воскресенье, 13.03.2016, 09:07 | Сообщение # 8
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
значит так, пишу про то как менять мышление при переходе с бейсика на Си/FLprog:
но надо иметь в виду и то, что FLProg сам тоже сильно отличается от чисто сишного подхода.

Бейсик-Си
1) "перейти" - всегда помнить что НЕТ номеров строк и НЕЛЬЗЯ сделать прямой переход.
2) места где хочется поставить "перейти на 40" заменять на команду "пропустить"
3) это самое "пропустить" реализуется через
if (условие) {
// одно
} else {
// другое
} // есть возможность добавить "третье" и тд...
в терминах FLprog это Компаратор и Вход разрешения(En)
4) перейти назад можно только при помощи циклов (for, while, ..)

FLprog
1) " то перейти на плату 60" - нет такого, и не будет никогда судя по всему.
плата обрабатывается всегда.
но если очень надо, то: содержимое платы заворачиваете в "блок пользователя", и управляете блоком ножкой EN (недавно появилось).
при этом оно как бы изолируется от программы, и у вас появляется возможность использовать этот блок несколько раз в программе (в бейсике подпрограммы проходили?)
2) " то перейти на плату 56" - возврат назад невозможен вообще, забудьте. только сверху вниз, и бесконечно зациклено.
3) про такие ожидания:
35 сравнить: A0 равно At, значит перейти на строку38
36 иначе: перейти на строку 34 и выполнять это в течении (100 миллисекунд)
38 вывести значения Аt

такой подход сам по себе плох
- значения с аналоговых входов всегда скачут, вы можете прождать все 100мс, а А0 меж тем будет скакать +-1,+-2,.. вокруг At и не совпасть строго ни разу.
- для этой проблемы используют усреднители разные и сравнения >,<
- ваша программа будет простаивать, для простых применений это нормально, но для приличного количества датчиков и действий это уже недопустимо.
4) "устранение дребезга на резистивной клавиатуре." решается в настройках аналогового входа. гляньте, попробуйте, и забудьте о этой проблеме. Вообще, если ваш пример в строках 32..38 это устранение дребезга, то вопрос вообще закрыт.
5) локальные циклы ожидания, итераторы и тд.. на базе For-to, goto, while, и тп... в FLprog стандартными блоками не используются!, за исключением штучных блоков работы с массивами. Цикл в FLprog один, главный цикл перебора плат loop().

PS:
если хотите вот прям стопорить программу и "зацикливать плату" могу написать вам нужный  "CODE-block"

PPS: на правах юмора с долей правды. если набрать FLprog на русском регистре получится АДзкщп.  wink


Сообщение отредактировал SirYorik - Воскресенье, 13.03.2016, 09:09
 
VirSpy Дата: Пятница, 18.03.2016, 23:16 | Сообщение # 9
Сержант
Группа: Проверенные
Сообщений: 55
Награды: 3
Репутация: 0
Статус: Offline
Простой пример. Анти дребезг аналоговой клавиатуры:

сделать темп входа
выждать
сравнить со входом, если не равно повторить предыдущую строку
записать в переменную

на Си много разных примеров, а как организовать в FL?
(пример)


Сообщение отредактировал VirSpy - Пятница, 18.03.2016, 23:20
 
Форум » Основной » Спросить у знатоков » for() to, для пользовательского блока (как сделать?)
Страница 1 из 11
Поиск:

FLProg © 2016
Яндекс.Метрика