Долго провозился, пока понял что математика не правильно считает. Работал с датчиком влажности почвы. Все работает как нужно. Решил организовать вывод в процентах. Вот тут и начались проблемы. При малых входных значениях вроде правильно показывает, при больших ересь какая-то. Но я то не сразу это понял. Просто проверял разные варианты влажности...
Оказалось математические блоки врут.
Для вычисления процента влажности я использовал такую формулу:
Данные: 1023 это 0% влажность
0 - это 100% влажность
Например 85 - это ?% влажность
Считаем: 100-(85*100/1023)=91%
А если сухо 1023 или скажем 1000
100-(1000*100/1023)=2%
А у нас что получается, если вычислять математикой?
Правильно, ересь какая-то. А дело в том, что объявленные константы имеют свой соответствующий тип. Например константе 100 я присвоил тип byte, и это справедливо, зачем резервировать памяти больше чем этого требует константа или переменная??? Соответственно и другие константы вписываются в свой тип. И в результате не работает с большими значениями. А все потому, что мы не можем указать тип выходных данных. Т.е должны быть возможность выбора типа для результата с блока.
Теперь, чтоб блок работал, мне пришлось всем участвующим константам и переменным присвоить тип Long Integer. Вот после этого вычисления стали работать правильно
Неправильный расчет математики
- AlexRyzh
- Сержант
- Сообщения: 107
- Зарегистрирован: 22 дек 2015, 11:06
- Откуда: Мелитополь
- Контактная информация:
Неправильный расчет математики
Посмотрим на скетч, как это все неправильно происходит.
Множитель выбран типа byte, а в скетче этот тип присваивается результату!!!
Ну это же не правильно!
Конечно, зная этот алгоритм, можно обмануть блок и назначить множителю Long Integer, хотя он легко вписывается в Byte
И зачем константе назначать тип, если в скетче формируется строка не через переменную, а чистым числом? Ведь если в строке подставляется число, то компилятору плевать, какой тип этого числа. Число оно и есть число. Тип назначается для переменной, а переменная в нашем случае как раз результат вычислений. А вот как раз результату мы и не имеем возможности присвоить тип!
Изменил тип только переменной на Лонг, считает не правильно
Изменил только в блоке умножения константы на Лонг, работает правильно!
По моему так не должно быть.
Множитель выбран типа byte, а в скетче этот тип присваивается результату!!!
Ну это же не правильно!
Конечно, зная этот алгоритм, можно обмануть блок и назначить множителю Long Integer, хотя он легко вписывается в Byte
И зачем константе назначать тип, если в скетче формируется строка не через переменную, а чистым числом? Ведь если в строке подставляется число, то компилятору плевать, какой тип этого числа. Число оно и есть число. Тип назначается для переменной, а переменная в нашем случае как раз результат вычислений. А вот как раз результату мы и не имеем возможности присвоить тип!
Изменил тип только переменной на Лонг, считает не правильно
Изменил только в блоке умножения константы на Лонг, работает правильно!
По моему так не должно быть.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- support
- Супермодератор
- Сообщения: 1917
- Зарегистрирован: 03 янв 2018, 11:45
- Откуда: Астрахань
- Имя: Сергей
- Поблагодарили: 23 раза
- Контактная информация:
Неправильный расчет математики
Вы немного не поняли принципа работы компилятора из С в машинный код контроллера. Когда Вы пишете на С математическое выражение, он сам определяет какую память выделять для результата, ориентируясь на типы входных операндов. Например если Вы пишете 1023 (Int) * 100 (Int) то и результат он положит в два байта (Int). У Вас в результате этой операции получится 102300 что никак не помещается в эту память Он же не знает какие там величины. Но при наличии в качестве хотя - бы одного оператора типа Long (например L1023*100) результат положится в четыре байта и значение расчета поместится. Обратите внимание что тип выхода блока при таком задании констант изменится и покажет что результат будет Long. Это особенность не FLProg а компилятора C, и я ничего с этим поделать не могу. Сказать компилятору в какой тип положить результаты вычислений другим способом не представляется возможным, поэтому я не могу сделать выбор типа выхода блока, а могу только показать каким он будет с точки зрения компилятора С, что и реализовано с самого начала.
Автор программы FLProg.
- AlexRyzh
- Сержант
- Сообщения: 107
- Зарегистрирован: 22 дек 2015, 11:06
- Откуда: Мелитополь
- Контактная информация:
Неправильный расчет математики
Спасибо. Теперь буду знать и учитывать это. Все ж не зря вопроса коснулся, все ж какой-то опыт 

Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость