Порядок выполнения - сложности с порядком...

Различные вопросы по программе не входящие в другие рубрики
Ответить
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Порядок выполнения - сложности с порядком...

#1

Сообщение Sancho » 08.05.2018{, 14:46}

Думаешь одно - на выходе другое...
Схема, часть
СпойлерПоказать
2018-05-08_14-30-52.png
2018-05-08_14-30-52.png (8.78 КБ) 2701 просмотр
2018-05-08_14-31-19.png
2018-05-08_14-31-19.png (5.79 КБ) 2701 просмотр
Код, часть:
СпойлерПоказать

Код: Выделить всё

_gtv13 = _count2P;
if ((_gtv38) != (_gtv13)) {
_gtv38 = _gtv13;
}
if((_gtv38) != (_gtv13)) _trgs1 = 1; // выполняется ещё раз, шаг № "16" !!! Но уже с другими значениями аргументов -_gtv38 !!!!
if(_gtv1) _trgs1 = 0;
if(_trgs1){ if(!_SEEPR1OSN){(updateIntegerToEEPROM(36, 0, 0x0, (_gtv13)));
_SEEPR1OSN=1;} }else{ if(_SEEPR1OSN){_SEEPR1OSN=0;}}
Лечение:
СпойлерПоказать
2018-05-08_14-44-05.png
2018-05-08_14-44-05.png (7.89 КБ) 2701 просмотр
Код:
СпойлерПоказать

Код: Выделить всё

_gtv13 = _count2P;
if((_gtv38) != (_gtv13)) _trgs1 = 1;
if(_gtv1) _trgs1 = 0;
if(_trgs1){ if(!_SEEPR1OSN){(updateIntegerToEEPROM(36, 0, 0x0, (_gtv13)));
_SEEPR1OSN=1;} }else{ if(_SEEPR1OSN){_SEEPR1OSN=0;}}
if ((_gtv38) != (_gtv13)) {
_gtv38 = _gtv13;
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25.02.2018{, 17:56}
Репутация: 24
Имя: sonata

Порядок выполнения - сложности с порядком...

#2

Сообщение pony sonata » 08.05.2018{, 15:05}

"доверяй, но проверяй" : )

Аватара пользователя
Alias
Лейтенант
Сообщения: 481
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

Порядок выполнения - сложности с порядком...

#3

Сообщение Alias » 08.05.2018{, 20:38}

Хорошо тем, кто еще в состоянии проверить. А как быть тем самым "непрограммистам"?

pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25.02.2018{, 17:56}
Репутация: 24
Имя: sonata

Порядок выполнения - сложности с порядком...

#4

Сообщение pony sonata » 08.05.2018{, 21:50}

Alias писал(а):
08.05.2018{, 20:38}
А как быть тем самым "непрограммистам"?
мучать сергея офк. тут по ходу проблема с "компилятором" с его графического языка ака FBD в виринг. нужна оптимизация

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Порядок выполнения - сложности с порядком...

#5

Сообщение Sancho » 12.06.2018{, 09:59}

Ещё сегодня обнаружился прикол. :crazy: :crazy:
Если сделать так:
СпойлерПоказать
2018-06-12_09-48-44.png
2018-06-12_09-48-44.png (3.28 КБ) 2534 просмотра
То получим:
_gtv1 = (_gtv1)-(1);
if (1){Serial.println(((String("Temperature № ")) + ((String((_FLPArray188591749[(_gtv1)-(1)]), DEC)))));}
Т.е. два раза отминусуем 1!!!!!!

А вот так - ок.
СпойлерПоказать
2018-06-12_09-47-49.png
2018-06-12_09-47-49.png (3.68 КБ) 2534 просмотра
Отправлено спустя 1 минуту 31 секунду:
Ещё раз убедился - не надо кроить переменные и экономить их и соединения на плате.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Serg_Grn
Лейтенант
Сообщения: 333
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 36
Имя: Сергей

Порядок выполнения - сложности с порядком...

#6

Сообщение Serg_Grn » 13.06.2018{, 07:50}

Sancho писал(а):
12.06.2018{, 10:01}
Ещё раз убедился - не надо кроить переменные и экономить их и соединения на плате.
Т.е. между разными функциональными блоками правильнее создавать переменную, чем просто тянуть линию связи?
А то я эту тему с переменными и линиями связи вроде понимаю, но на интуитивном уровне :) Досконального понимания в чём разница пока нет...

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

Порядок выполнения - сложности с порядком...

#7

Сообщение dizzyy » 13.06.2018{, 09:28}

Sancho писал(а):
12.06.2018{, 10:01}
Ещё сегодня обнаружился прикол.
А какая последовательность была что так получилось?

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Порядок выполнения - сложности с порядком...

#8

Сообщение Sancho » 13.06.2018{, 09:43}

Serg_Grn писал(а):
13.06.2018{, 07:50}
Т.е. между разными функциональными блоками правильнее создавать переменную, чем просто тянуть линию связи?
Если просто выход на вход, без ветвления, то ничего не надо. Если всё работает и устраивает - тоже.
Но бывают моменты, когда вроде как работает, но потом оценив результат, понимаешь, что криво, и надо разобраться.
Например, проверено 100%, когда используем дисплей, и перед ним собираем("сложение строк") строку из нескольких кусков, лучше создать переменную типа стринг, и результат присваивать ей, а уже потом эту переменную выводить на дисплей. Это ускоряет работу программы, не очень существенно, но всё-же, ведь работа со строками не самая быстрая, а программа при выводе делает сборку дважды: при подготовке к отправке, и при оценки изменении длинны строки для очистки экрана. Код становится читабельнее.
НапримерПоказать

Код: Выделить всё

_gtv14 = ((String("Ush=")) + (( _floatToStringWitRaz(V_Shunt_230392479_2,2))) + (String("mV")) + (String("___I=")) + (String("")) + (String("A")));
if (1) {
_dispTempLength1 = ((((String("U=")) + (( _floatToStringWitRaz(Voltage_230392479_2,2))) + (String("V")) + (String("___I=")) + (( _floatToStringWitRaz(Current_230392479_2,2))) + (String("A"))))).length();
if (_disp12oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp12oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((((String("U=")) + (( _floatToStringWitRaz(Voltage_230392479_2,2))) + (String("V")) + (String("___I=")) + (( _floatToStringWitRaz(Current_230392479_2,2))) + (String("A")))));
} else {
if (_disp12oldLength > 0) {_isNeedClearDisp1 = 1; _disp12oldLength = 0;} 
}
if (1) {
_dispTempLength1 = ((_gtv14)).length();
if (_disp13oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp13oldLength = _dispTempLength1;
_lcd1.setCursor(0, 1);
_lcd1.print((_gtv14));
} else {
if (_disp13oldLength > 0) {_isNeedClearDisp1 = 1; _disp13oldLength = 0;} 
}
СпойлерПоказать
2018-06-13_09-43-01.png
2018-06-13_09-43-01.png (6.74 КБ) 2439 просмотров
Отправлено спустя 5 минут 7 секунд:
dizzyy писал(а):
13.06.2018{, 09:28}
А какая последовательность была что так получилось?
Всё по фэншую, вроде. Но! Он два раза вычитает: когда вычисляет для переменной, и второй раз для массива, но переменная уже меньше на 1!!!
А с переменной - всё ок, для массива использует уже её, пост 5, второй спойлер.
СпойлерПоказать
2018-06-13_09-46-08.png
2018-06-13_09-46-08.png (4.51 КБ) 2432 просмотра
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

Порядок выполнения - сложности с порядком...

#9

Сообщение dizzyy » 13.06.2018{, 10:02}

Sancho писал(а):
13.06.2018{, 09:48}
А с переменной - всё ок, для массива использует уже её, пост 5, второй спойлер.
и я так часто пользуюсь , теперь надо будет немного изменять.. пускай лучше переменных будет больше

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Порядок выполнения - сложности с порядком...

#10

Сообщение Sancho » 13.06.2018{, 10:10}

dizzyy писал(а):
13.06.2018{, 10:02}
пускай лучше переменных будет больше
Всё дело, в моём примере, в том, что переменная обновляет своё значение. Если бы там была другая переменная - всё работало бы и так.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

Порядок выполнения - сложности с порядком...

#11

Сообщение dizzyy » 13.06.2018{, 13:06}

Sancho писал(а):
13.06.2018{, 10:10}
Всё дело, в моём примере,
и у меня есть такие способы иногда, теперь надо знать что бы не делать ответвлений .
СпойлерПоказать
Безымянный.JPG

pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25.02.2018{, 17:56}
Репутация: 24
Имя: sonata

Порядок выполнения - сложности с порядком...

#12

Сообщение pony sonata » 13.06.2018{, 13:29}

ну это явный баг программы. пинайте автора, чтобы исправил :)

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 789
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Порядок выполнения - сложности с порядком...

#13

Сообщение support » 17.06.2018{, 19:08}

Пролемма то понятна, я ещё когда начинал, я ещё в самом начале работы над программой решал эту дилему.
А дело вот в чем.
Размер памяти для программы в контроллере намного больше чем размер памяти для переменных. В принципе можно для каждого выхода каждого блока создать переменную хранящую значение результата работы этого блока. Но это приведёт к неоправданному расходу памяти переменных (но плюсом будет уменьшение времени цикла выполнения программы).
Поэтому я стараюсь ловить компромисс. Где это возможно (математика, простейшие логические блоки, блоки сравнения) я выполняю на лету. Особенно это дает плюс в сложной логике.
Но вот в таких схемах где результат работы блоков тут же используется на их входах в пределах одного цикла, может вызвать проблеммы. Как сделать лучше, я не знаю. В принципе переделать все базовые блоки на сохранение выходных значений в переменные - дело пары дней, но вот надо ли??? тогда точно памяти хватать не будет.
Автор программы FLProg.

pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25.02.2018{, 17:56}
Репутация: 24
Имя: sonata

Порядок выполнения - сложности с порядком...

#14

Сообщение pony sonata » 17.06.2018{, 19:35}

А нельзя как-то сделать проверку, что если используется переменная в том же цикле на входах и выходах, чтобы логика компилятора менялась, а в другом случае все шло по дефолту? В принципе это же частный случай получается

Аватара пользователя
jonik22sm
Капитан
Сообщения: 703
Зарегистрирован: 20.11.2015{, 11:28}
Репутация: 6
Откуда: Краснодар
Имя: Евгений
Контактная информация:

Порядок выполнения - сложности с порядком...

#15

Сообщение jonik22sm » 17.06.2018{, 23:50}

А можно ли переменными заполнять под завязку?
Не будет глючит контроллер?
Имя переменной играет роль заполнености памяти контроллер?
Можно сделать ВСЁ. Было бы желание.

pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25.02.2018{, 17:56}
Репутация: 24
Имя: sonata

Порядок выполнения - сложности с порядком...

#16

Сообщение pony sonata » 17.06.2018{, 23:52}

)

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 789
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Порядок выполнения - сложности с порядком...

#17

Сообщение support » 18.06.2018{, 02:01}

jonik22sm писал(а):
17.06.2018{, 23:50}
А можно ли переменными заполнять под завязку?
Не будет глючит контроллер?
Имя переменной играет роль заполнености памяти контроллер?
  • Можно забить процентов на 90 и начнёт глючить (проверенно).
  • Имя переменной на размер занимаемой памяти никак не влияет
Отправлено спустя 1 минуту 21 секунду:
pony sonata писал(а):
17.06.2018{, 19:35}
А нельзя как-то сделать проверку, что если используется переменная в том же цикле на входах и выходах, чтобы логика компилятора менялась, а в другом случае все шло по дефолту? В принципе это же частный случай получается
Можно наверное, но пару месяцев на это убить придётся. Задача достаточно нетривиальная
Автор программы FLProg.

pony sonata
Лейтенант
Сообщения: 373
Зарегистрирован: 25.02.2018{, 17:56}
Репутация: 24
Имя: sonata

Порядок выполнения - сложности с порядком...

#18

Сообщение pony sonata » 18.06.2018{, 02:33}

а как вообще похожую ситуацию решают в том же кодесисе или прочих?

Отправлено спустя 2 минуты 11 секунд:
а все дошло. там нету таких ужимок с памятью

Ответить

Вернуться в «Прочие вопросы»