for() to, для пользовательского блока

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Аватара пользователя
VirSpy
Рядовой
Сообщения: 62
Зарегистрирован: 03.12.2015{, 22:40}
Репутация: 3
Откуда: Минск, РБ

for() to, для пользовательского блока

#1

Сообщение VirSpy » 08.03.2016{, 14:40}

...не знаю, как описать мысли. из курса ZXBasic что-то припоминается...
Суть: при определенном условии (например, и далее в кавычках, - при поступлении данных с КОМпорта) запустить пользовательский блок. Он, в свою очередь, выполняется (сверка принятых данных с массивом), пока не будут достигнуты - А: конец цикла (нет совпадений), Б: условие выхода (есть совпадение с Н элементом). Ну и соответственно на выходе блока имеем bА, bБ и iН . Только после продолжаем выполнение основной программы.
Спасибо.
Последний раз редактировалось VirSpy 08.03.2016{, 14:41}, всего редактировалось 1 раз.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 62
Контактная информация:

for() to, для пользовательского блока

#2

Сообщение Олег » 08.03.2016{, 16:12}

В новой версии программы появился вход En для пользовательских блоков FBD или LD, ну а внутри блока компаратор. Если я правильно понял что вы хотите.

Аватара пользователя
VirSpy
Рядовой
Сообщения: 62
Зарегистрирован: 03.12.2015{, 22:40}
Репутация: 3
Откуда: Минск, РБ

for() to, для пользовательского блока

#3

Сообщение VirSpy » 08.03.2016{, 21:50}

Не пойму, как зациклить середину блока, и как пропускать весь блок при 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 ...   "продолжаем прогу"
Для скачивания вложений Вы должны быть зарегистрированы.

TVG
Рядовой
Сообщения: 47
Зарегистрирован: 15.09.2015{, 14:40}
Репутация: 0

for() to, для пользовательского блока

#4

Сообщение TVG » 08.03.2016{, 21:56}

Помоему  это все можно нарисовать не на коде си а блоками там для этого всего есть блоки (бейсик довольно сильно отличеатся от си) а главно продумать алгоритм :))
у вас уже нарисован блок пользователя что то я не совсем понял что вам еще нужно ?
Последний раз редактировалось TVG 08.03.2016{, 22:09}, всего редактировалось 1 раз.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 62
Контактная информация:

for() to, для пользовательского блока

#5

Сообщение Олег » 08.03.2016{, 23:57}

Вы просто объясните что вы хотите словами, мне например бэйсик неведом.

SirYorik
Сержант
Сообщения: 124
Зарегистрирован: 04.10.2015{, 10:01}
Репутация: 0
Откуда: Томск

for() to, для пользовательского блока

#6

Сообщение SirYorik » 09.03.2016{, 12:09}

что такое "проверка массива"? от этого зависит вид решения (бейсик то я понял)


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

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

эта схема
5333523.jpg
делает такой код:

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;
}
Для скачивания вложений Вы должны быть зарегистрированы.
Последний раз редактировалось SirYorik 09.03.2016{, 12:10}, всего редактировалось 1 раз.

Аватара пользователя
VirSpy
Рядовой
Сообщения: 62
Зарегистрирован: 03.12.2015{, 22:40}
Репутация: 3
Откуда: Минск, РБ

for() to, для пользовательского блока

#7

Сообщение VirSpy » 11.03.2016{, 20:08}

Попытаюсь описать на 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
Сержант
Сообщения: 124
Зарегистрирован: 04.10.2015{, 10:01}
Репутация: 0
Откуда: Томск

for() to, для пользовательского блока

#8

Сообщение SirYorik » 13.03.2016{, 09:07}

значит так, пишу про то как менять мышление при переходе с бейсика на Си/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 на русском регистре получится АДзкщп.  Изображение
Последний раз редактировалось SirYorik 13.03.2016{, 09:09}, всего редактировалось 1 раз.

Аватара пользователя
VirSpy
Рядовой
Сообщения: 62
Зарегистрирован: 03.12.2015{, 22:40}
Репутация: 3
Откуда: Минск, РБ

for() to, для пользовательского блока

#9

Сообщение VirSpy » 18.03.2016{, 23:16}

Простой пример. Анти дребезг аналоговой клавиатуры:

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

на Си много разных примеров, а как организовать в FL?
(пример)
Последний раз редактировалось VirSpy 18.03.2016{, 23:20}, всего редактировалось 1 раз.

Ответить

Вернуться в «Спросить у знатоков»