Страница 1 из 1
Порядок выполнения - сложности с порядком...
Добавлено: 08 май 2018, 14:46
Sancho
Думаешь одно - на выходе другое...
Схема, часть
[spoiler]
2018-05-08_14-30-52.png
2018-05-08_14-31-19.png
[/spoiler]
Код, часть:
[spoiler]
Код: Выделить всё
_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;}}
[/spoiler]
Лечение:
[spoiler]
2018-05-08_14-44-05.png
[/spoiler]
Код:
[spoiler]
Код: Выделить всё
_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;
[/spoiler]
Порядок выполнения - сложности с порядком...
Добавлено: 08 май 2018, 15:05
pony sonata
"доверяй, но проверяй" : )
Порядок выполнения - сложности с порядком...
Добавлено: 08 май 2018, 20:38
Alias
Хорошо тем, кто еще в состоянии проверить. А как быть тем самым "непрограммистам"?
Порядок выполнения - сложности с порядком...
Добавлено: 08 май 2018, 21:50
pony sonata
Alias писал(а): 08 май 2018, 20:38А как быть тем самым "непрограммистам"?
мучать сергея офк. тут по ходу проблема с "компилятором" с его графического языка ака FBD в виринг. нужна оптимизация
Порядок выполнения - сложности с порядком...
Добавлено: 12 июн 2018, 10:01
Sancho
Ещё сегодня обнаружился прикол.
Если сделать так:
[spoiler]
2018-06-12_09-48-44.png
[/spoiler]
То получим:
_gtv1 = (_gtv1)-(1);
if (1){Serial.println(((String("Temperature № ")) + ((String((_FLPArray188591749[(_gtv1)-(1)]), DEC)))));}
Т.е. два раза отминусуем 1!!!!!!
А вот так - ок.
[spoiler]
2018-06-12_09-47-49.png
[/spoiler]
Отправлено спустя 1 минуту 31 секунду:
Ещё раз убедился - не надо кроить переменные и экономить их и соединения на плате.
Порядок выполнения - сложности с порядком...
Добавлено: 13 июн 2018, 07:50
Serg_Grn
Sancho писал(а): 12 июн 2018, 10:01Ещё раз убедился - не надо кроить переменные и экономить их и соединения на плате.
Т.е. между разными функциональными блоками правильнее создавать переменную, чем просто тянуть линию связи?
А то я эту тему с переменными и линиями связи вроде понимаю, но на интуитивном уровне

Досконального понимания в чём разница пока нет...
Порядок выполнения - сложности с порядком...
Добавлено: 13 июн 2018, 09:28
dizzyy
Sancho писал(а): 12 июн 2018, 10:01Ещё сегодня обнаружился прикол.
А какая последовательность была что так получилось?
Порядок выполнения - сложности с порядком...
Добавлено: 13 июн 2018, 09:48
Sancho
Serg_Grn писал(а): 13 июн 2018, 07:50Т.е. между разными функциональными блоками правильнее создавать переменную, чем просто тянуть линию связи?
Если просто выход на вход, без ветвления, то ничего не надо. Если всё работает и устраивает - тоже.
Но бывают моменты, когда вроде как работает, но потом оценив результат, понимаешь, что криво, и надо разобраться.
Например, проверено 100%, когда используем дисплей, и перед ним собираем("сложение строк") строку из нескольких кусков, лучше создать переменную типа стринг, и результат присваивать ей, а уже потом эту переменную выводить на дисплей. Это ускоряет работу программы, не очень существенно, но всё-же, ведь работа со строками не самая быстрая, а программа при выводе делает сборку дважды: при подготовке к отправке, и при оценки изменении длинны строки для очистки экрана. Код становится читабельнее.
[spoiler=Например]
Код: Выделить всё
_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;}
}
[/spoiler]
[spoiler]
2018-06-13_09-43-01.png
[/spoiler]
Отправлено спустя 5 минут 7 секунд:
dizzyy писал(а): 13 июн 2018, 09:28А какая последовательность была что так получилось?
Всё по фэншую, вроде. Но! Он два раза вычитает: когда вычисляет для переменной, и второй раз для массива, но переменная уже меньше на 1!!!
А с переменной - всё ок, для массива использует уже её, пост 5, второй спойлер.
[spoiler]
2018-06-13_09-46-08.png
[/spoiler]
Порядок выполнения - сложности с порядком...
Добавлено: 13 июн 2018, 10:02
dizzyy
Sancho писал(а): 13 июн 2018, 09:48А с переменной - всё ок, для массива использует уже её, пост 5, второй спойлер.
и я так часто пользуюсь , теперь надо будет немного изменять.. пускай лучше переменных будет больше
Порядок выполнения - сложности с порядком...
Добавлено: 13 июн 2018, 10:10
Sancho
dizzyy писал(а): 13 июн 2018, 10:02пускай лучше переменных будет больше
Всё дело, в моём примере, в том, что переменная обновляет своё значение. Если бы там была другая переменная - всё работало бы и так.
Порядок выполнения - сложности с порядком...
Добавлено: 13 июн 2018, 13:06
dizzyy
Sancho писал(а): 13 июн 2018, 10:10Всё дело, в моём примере,
и у меня есть такие способы иногда, теперь надо знать что бы не делать ответвлений .
[spoiler]
Безымянный.JPG
[/spoiler]
Порядок выполнения - сложности с порядком...
Добавлено: 13 июн 2018, 13:29
pony sonata
ну это явный баг программы. пинайте автора, чтобы исправил

Порядок выполнения - сложности с порядком...
Добавлено: 17 июн 2018, 19:08
support
Пролемма то понятна, я ещё когда начинал, я ещё в самом начале работы над программой решал эту дилему.
А дело вот в чем.
Размер памяти для программы в контроллере намного больше чем размер памяти для переменных. В принципе можно для каждого выхода каждого блока создать переменную хранящую значение результата работы этого блока. Но это приведёт к неоправданному расходу памяти переменных (но плюсом будет уменьшение времени цикла выполнения программы).
Поэтому я стараюсь ловить компромисс. Где это возможно (математика, простейшие логические блоки, блоки сравнения) я выполняю на лету. Особенно это дает плюс в сложной логике.
Но вот в таких схемах где результат работы блоков тут же используется на их входах в пределах одного цикла, может вызвать проблеммы. Как сделать лучше, я не знаю. В принципе переделать все базовые блоки на сохранение выходных значений в переменные - дело пары дней, но вот надо ли??? тогда точно памяти хватать не будет.
Порядок выполнения - сложности с порядком...
Добавлено: 17 июн 2018, 19:35
pony sonata
А нельзя как-то сделать проверку, что если используется переменная в том же цикле на входах и выходах, чтобы логика компилятора менялась, а в другом случае все шло по дефолту? В принципе это же частный случай получается
Порядок выполнения - сложности с порядком...
Добавлено: 17 июн 2018, 23:50
jonik22sm
А можно ли переменными заполнять под завязку?
Не будет глючит контроллер?
Имя переменной играет роль заполнености памяти контроллер?
Порядок выполнения - сложности с порядком...
Добавлено: 17 июн 2018, 23:52
pony sonata
)
Порядок выполнения - сложности с порядком...
Добавлено: 18 июн 2018, 02:02
support
jonik22sm писал(а): 17 июн 2018, 23:50А можно ли переменными заполнять под завязку?
Не будет глючит контроллер?
Имя переменной играет роль заполнености памяти контроллер?
- Можно забить процентов на 90 и начнёт глючить (проверенно).
- Имя переменной на размер занимаемой памяти никак не влияет
Отправлено спустя 1 минуту 21 секунду:
pony sonata писал(а): 17 июн 2018, 19:35А нельзя как-то сделать проверку, что если используется переменная в том же цикле на входах и выходах, чтобы логика компилятора менялась, а в другом случае все шло по дефолту? В принципе это же частный случай получается
Можно наверное, но пару месяцев на это убить придётся. Задача достаточно нетривиальная
Порядок выполнения - сложности с порядком...
Добавлено: 18 июн 2018, 02:36
pony sonata
а как вообще похожую ситуацию решают в том же кодесисе или прочих?
Отправлено спустя 2 минуты 11 секунд:
а все дошло. там нету таких ужимок с памятью