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


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

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


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: Сергей, support 
Форум » Баг - Трекер » Не принятые » порядок операторов в СиКоде не соответсвует порядку на плате (приходится множить платы (1.10.4))
порядок операторов в СиКоде не соответсвует порядку на плате
SirYorik
Дата: Четверг, 25.02.2016, 11:32 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
пример:



преобразуетсся в 7 считываний, усреднение (с 0-ми, или старыми данными в последних 3х элементах массива), только потом еще три считывания.

приходится усреднение отселять на следующую плату.


Код
_FLPArray156147530[0] =  (analogRead (2));
_FLPArray156147530[1] =  (analogRead (2));
_FLPArray156147530[2] =  (analogRead (2));
_FLPArray156147530[3] =  (analogRead (2));
_FLPArray156147530[4] =  (analogRead (2));
_FLPArray156147530[5] =  (analogRead (2));
_FLPArray156147530[6] =  (analogRead (2));
_SUETFLPA3 = 0;
for(_SUETFLPATemp = 0; _SUETFLPATemp < 10; _SUETFLPATemp = _SUETFLPATemp + 1){_SUETFLPA3 = _SUETFLPA3 + _FLPArray156147530[_SUETFLPATemp];}
_FLPArray156147530[7] =  (analogRead (2));
_FLPArray156147530[8] =  (analogRead (2));
_FLPArray156147530[9] =  (analogRead (2));
_gtv10 = (_SUETFLPA3)/(10);
Прикрепления: 0305971.jpg(52Kb)


Сообщение отредактировал SirYorik - Четверг, 25.02.2016, 19:27
 
SirYorik Дата: Четверг, 25.02.2016, 11:53 | Сообщение # 2
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
второй пример:


Код
if(_gen2O) _count1P = (_gtv4); // ПРЕСЕТ счетчика по выходу Одновибратора. В первом цикле код Одновибратора еще не отрабатывал.

// КОД СЧЕТЧИКА
if (( (_gen1O) && (!(( ( _count1P  >=  (_gtv11)) && (!((_gtv2) == (2))) ))) && (( ((_gtv2) == (1)) || ((_gtv2) == (2)) )) ))
   {
   if (! _count1I)  
      {
        if (_trgr1) {_count1P = _count1P+1;} else {_count1P = _count1P-1;};
       _count1I = 1;
      }
   }
else
   {
   _count1I=0;
   }

// Здесь РЕСЕТ счетчика, если счетчик уехал в минуса (к делу отношения не имеет)
if ((_gtv4) < (0)) _count1P = 0;
// Здесь UP|DOWN счетчика (к делу отношения не имеет)
if((_gtv2) == (2)) _trgr1 = 0;
if((_gtv2) == (1)) _trgr1 = 1;

// а вот и ИСКОМЫЙ одновибратор, начнет влиять на счетчик только на втором цикле
if (1) {if (! _gen2I){_gen2I = 1; _gen2O = 1; _gen2P = millis();}} else { _gen2I = 0 ; _gen2O= 0; } if (_gen2I &&  _gen2O)   _gen2O = !( _isTimer( _gen2P , 5 ));

// ВЫХОД счетчика
_gtv4 = _count1P;
Прикрепления: 4787134.jpg(20Kb)


Сообщение отредактировал SirYorik - Четверг, 25.02.2016, 11:53
 
SirYorik Дата: Четверг, 25.02.2016, 19:18 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
убился искать почему шим в разнос идет, а оказалось пример №3:



декларации (tmp* - диагностические переменные)



сам код Платы.
ПЕРВЫМ выполняется код Switch который управляется stJUMP, из середины откуда-ближе к концу.
в результате в pin пишется всякая чтопопала. снова нужно пилить плату на две.



в результате вместо сходимости ШИМ к 68 получаю адский разброс:


осциллограмма вообще фееричная :).

но по сумме это жесть!

Добавлено (25.02.2016, 19:18)
---------------------------------------------
что и требовалось доказать, разделение платы на две немедленно нормализовало работу.

а вот правильный код от двух плат


Прикрепления: 1184077.jpg(62Kb)


Сообщение отредактировал SirYorik - Четверг, 25.02.2016, 19:02
 
SirYorik Дата: Суббота, 27.02.2016, 21:30 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
четвертая серия, эпизод первый:



кусок схемы обведенный красным никогда не выполнится, потому что компилируется в два if:

Код
if (( ((_gtv15) >= ((_gtv13)/(-1))) && ((_gtv15) <= ((_gtv13)/(-2))) && (_gtv28) && (_gtv27) && (_gtv18) && (!(_gtv29)) )) {
_gtv28 = 0;
}
if (( ((_gtv15) >= ((_gtv13)/(-1))) && ((_gtv15) <= ((_gtv13)/(-2))) && (_gtv28) && (_gtv27) && (_gtv18) && (!(_gtv29)) )) {
_gtv9 = _gtv30;
}
условия-то одинаковые, правда выполняются МК дважды (типа зря),  первое выполнение меняет переменную из условия, в результате второе уже не сработает.
приходится подбирать костыль, им оказался Rtrig:




Код
if (( ((_gtv15) >= ((_gtv13)/(-1))) && ((_gtv15) <= ((_gtv13)/(-2))) && (_gtv28) && (_gtv27) && (_gtv18) && (!(_gtv29)) )) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (( ((_gtv15) >= ((_gtv13)/(-1))) && ((_gtv15) <= ((_gtv13)/(-2))) && (_gtv28) && (_gtv27) && (_gtv18) && (!(_gtv29)) )) {
_gtv9 = _gtv30;
}
if (_trgrt3) {
_gtv28 = 0;
}
с костылём задуманное работает.

эпизод второй:


схема дурацкая, почему-то глядя на описание решил что это сработает защелкой, проникся когда глянул на код в поисках глюка.


Код
if(( ((_mux2) > (0)) && (!(_gtv28)) )) _trgs1 = 1;
if(0) _trgs1 = 0; // <------- if(0) !!!
Прикрепления: 5200990.jpg(34Kb) · 6967996.jpg(35Kb) · 7024888.jpg(11Kb)


Сообщение отредактировал SirYorik - Суббота, 27.02.2016, 21:30
 
support Дата: Суббота, 27.02.2016, 22:11 | Сообщение # 5
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Прокомментирую.
Эпизод 1.
Всё таки это программа, и надо учитывать что она выполняется последовательно. Могу вместо костыля с R-тригером предложить положить значения после блока And в переменную (тогда логика будет вычисляться один раз) , а затем её уже использовать в качестве команды на запись. Тогда это не будет костылём. Вообще нежелательно использовать такие методы когда в одной логической цепочке результат её исполнения меняет входные данные. Лучше использовать промежуточные переменные, и разбивать на несколько цепочек.
Эпизод 2
А что Вы ожидали увидеть? Стандартный код для тригера. Вы поставили константу false(0) на вход триггера, и удивляетесь почему 0..... Поставили бы туда константу true(1) увидели бы еденицу. Я не отслеживаю что подаётся на вход - константа или выход другого блока. В принципе это можно было - бы сделать, но на вижу необходимости. Я не понимаю зачем может понадобится на вход триггера подавать константу. Он один раз сработает и больше никогда не сброситься. Может Вы мне объясните необходимость такой ситуации. Сброс то по любому когда то должен произойти (в Вашей схеме для сброса триггера в 0 потребуется перезапуск контроллера - то же бред по моему)


Разработчик программы FLProg
 
SirYorik Дата: Воскресенье, 28.02.2016, 22:16 | Сообщение # 6
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
Цитата support ()
Лучше использовать промежуточные переменные, и разбивать на несколько цепочек.
ок.


Цитата
Всё таки это программа, и надо учитывать что она выполняется последовательно.

просто ожидалось мною, что две переменные на одном проводе изменятся одновременно, а входные условия повторно проверятся только на следующей итерации луп().
факт что условия на плате могут сработать дважды за один цикл - неожиданен.

Цитата support ()
Может Вы мне объясните необходимость такой ситуации.
да просто косяк.

хотя необходимость сделать разовую операцию за всё время работы МК есть, а вот способ не очевиден. теперь буду знать что можно криво заюзать RSтриггер для этого.
 
Naladchik Дата: Понедельник, 29.02.2016, 08:11 | Сообщение # 7
Лейтенант
Группа: Проверенные
Сообщений: 116
Награды: 0
Репутация: 0
Статус: Offline
Цитата SirYorik ()
хотя необходимость сделать разовую операцию за всё время работы МК есть, а вот способ не очевиден. теперь буду знать что можно криво заюзать RSтриггер для этого.
Какой смысл юзать для этого триггер если можно использовать вход En у переменной подав туда импульс и константу на вход (лично я это постоянно использую, очень удобно) или же заранее ей задать необходимое значение при объявлении?
А использование входа En у переменных в большинстве случаев отменяет необходимость использования RS триггера да и работа программы намного логичнее становится, проще баги отлавливать Понятно когда и почему изменилось состояние переменной.


Предпочитаю Portable версию.


Сообщение отредактировал Naladchik - Понедельник, 29.02.2016, 08:20
 
Слимпер Дата: Понедельник, 29.02.2016, 09:13 | Сообщение # 8
Генерал-лейтенант
Группа: Проверенные
Сообщений: 661
Награды: 25
Репутация: 23
Статус: Offline
Цитата support ()
Всё таки это программа, и надо учитывать что она выполняется последовательно
Все хотел спросить, в какой последовательности обрабатываются блоки на плате:

Сверху вниз слева направо  (столбцами)

Или 

Слева направо сверху вниз (строками)

И по какому краю блока это определяется 

Вообще то, во многих средах указывается индексы рядом с блоками, указывающий последовательность их обработки (а в некоторых вообще его можно вручную задавать, но это уже лишнее)
 
Naladchik Дата: Понедельник, 29.02.2016, 09:21 | Сообщение # 9
Лейтенант
Группа: Проверенные
Сообщений: 116
Награды: 0
Репутация: 0
Статус: Offline
Цитата Слимпер ()
Все хотел спросить, в какой последовательности обрабатываются блоки на плате:
Поддерживаю, интересный вопрос.


Предпочитаю Portable версию.
 
SirYorik Дата: Понедельник, 29.02.2016, 09:42 | Сообщение # 10
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
Цитата Naladchik ()
вход En у переменной подав туда импульс

вот чтото не нравится мне использовать импульсы (одновибратор, он же таймер).
а не в курсе как выставить импульс длительностью не более одного цикла loop(). а от фонаря 1мс на десяток-сотню циклов дёргать одну переменную....
 
support Дата: Понедельник, 29.02.2016, 09:51 | Сообщение # 11
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Цитата SirYorik ()
а не в курсе как выставить импульс длительностью не более одного цикла loop(). а от фонаря 1мс на десяток-сотню циклов дёргать одну переменную....
Для этого служит R-триггер. Это блок выделения переднего фронта. При переходе сигнала на входе с 0 на 1 на выходе формируется импульс длинной в один цикл программы.


Разработчик программы FLProg
 
support Дата: Понедельник, 29.02.2016, 11:37 | Сообщение # 12
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Цитата Слимпер ()
Все хотел спросить, в какой последовательности обрабатываются блоки на плате:
Блоки в плате могут быть трёх видов. Расчитываемые, оконечные, и логические. 
В первую очередь обрабатываются расчитываеммые блоки. Это триггеры, таймеры, генераторы, сенсоры и т.д.
Затем обрабатываются оконечные блоки. Это в основном блоки которые не имеют выходов. Например вывод на дисплей, вывод на UART, запись в переменные.
Порядок обработки блоков внутри групп организован следующим образом.  Первым обрабатывается блок наиболее близкий по прямой (пришлось вспоминать расчёт гипотенузы в прямоугольном треугольнике) к правому верхнему углу платы. Последним соответственно самый дальний.
Логические блоки  (например AND, OR, входы, математика) не рассчитываются. При обработке блоков других типов запрашивается состояние выходов таких блоков. Они в ответ выдают логические выражения (готовый код С) соответствующие своей логике.  Такое решение принято для экономии памяти контроллера. Не хорошо было бы для каждого логического или математического действия создавать переменную. В большинстве случаев в этом нет необходимости.
Ну где то так. Это очень упрощённо, на самом деле логика компилятора намного сложнее. Я даже не очень представляю как её описать подробно. На это потребуется много времени и сил.


Разработчик программы FLProg
 
Слимпер Дата: Понедельник, 29.02.2016, 12:14 | Сообщение # 13
Генерал-лейтенант
Группа: Проверенные
Сообщений: 661
Награды: 25
Репутация: 23
Статус: Offline
Цитата support ()
Блоки в плате могут быть трёх видов. Расчитываемые, оконечные, и логические.
  Теперь я понял почему у меня довольно часто получается не то, что я хотел.
Думал, что есть строгая последовательность обработки блоков, как принято в FBD.
Будем учитывать.

Хотя я так до конца и не понял порядок  (из одной группы), по длине гипотенузы от верхнего левого угла платы? Чем короче тем раньше, чем длиннее тем позже?

А сложно сделать вывод индекса последовательности обработке  блока на плате ?

Добавлено (29.02.2016, 12:14)
---------------------------------------------
А пользовательские блоки и какой группе относятся?

 
support Дата: Понедельник, 29.02.2016, 12:33 | Сообщение # 14
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Цитата Слимпер ()
Хотя я так до конца и не понял порядок (из одной группы), по длине гипотенузы от верхнего левого угла платы? Чем короче тем раньше, чем длиннее тем позже?
Совершенно верно,  только не левого а правого
Цитата Слимпер ()
А сложно сделать вывод индекса последовательности обработке блока на плате ?
Порядок  обработки рассчитывается в момент компиляции. Если делать это на лету при отрисовке - программа начнёт тормозить (Вы передвинули блок - порядок изменился).

Цитата Слимпер ()
А пользовательские блоки и какой группе относятся?

Рассчитываемые


Разработчик программы FLProg
 
Слимпер Дата: Понедельник, 29.02.2016, 15:34 | Сообщение # 15
Генерал-лейтенант
Группа: Проверенные
Сообщений: 661
Награды: 25
Репутация: 23
Статус: Offline
Цитата support ()
Порядок обработки блоков внутри групп организован следующим образом.  Первым обрабатывается блок наиболее близкий по прямой (пришлось вспоминать расчёт гипотенузы в прямоугольном треугольнике) к правому верхнему углу платы. Последним соответственно самый дальний.




Правильно нарисовал?  wacko shock или все же так



Цитата support ()
Порядок  обработки рассчитывается в момент компиляции. Если делать это на лету при отрисовке - программа начнёт тормозить (Вы передвинули блок - порядок изменился).
Я так и предполагал, жаль. Чтобы не тормозила все время можно было бы сделать так:
1. нажал на кнопку на панели
2. для текущей платы рассчитать индексы,
3. отобразились над блоками, посмотрел,
4. сдвинул блок (или отжал кнопку)
5. индексы пропали.
Но это так размышления.

А вот в каком порядке идёт расчёт на плате, надо обязательно где нибудь подробно написать.
Прикрепления: 4643946.png(8Kb) · 4566520.png(9Kb)


Сообщение отредактировал Слимпер - Понедельник, 29.02.2016, 15:35
 
Форум » Баг - Трекер » Не принятые » порядок операторов в СиКоде не соответсвует порядку на плате (приходится множить платы (1.10.4))
Страница 1 из 212»
Поиск:

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