Segnetics

Вернуться   Segnetics > Форум Segnetics > SMLogix > SMArt

SMArt Разработка интерфейсов пользователя

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2015, 12:04   #1
Mihakorb
Новичок
 
Регистрация: Jul 2013
Сообщения: 1
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию SМart. Разрядность блока "Ввод числа"

Здравствуйте, Арсений!

Подскажите пожалуйста. Использую в Smart блок "Ввод числа" с возможностью вывода. Нужно сделать ввод числа с клавиатуры 8 знаков. Делаю ввод 66666660 получаю 66666664, 99999990 получаю 99999992, 99999999 получаю 100000000 ПОЧЕМУ??? Тип цифр LONG. Если использую Input number 2g, то вывод данных корректен.

Использую последнюю версию smlogix, которая мне предложила прошить smh2gi, я прошил ничего не изменилось.

Просьба помочь вопросе.
Mihakorb вне форума   Ответить с цитированием
Старый 18.06.2015, 12:20   #2
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 117
Благодарил(а): 15 раз(а)
Поблагодарили: 660 раз(а) в 604 сообщениях
По умолчанию Ответ: SМart блок "Ввод числа"

Цитата:
Сообщение от Mihakorb Посмотреть сообщение
Здравствуйте, Арсений!

Подскажите пожалуйста. Использую в Smart блок "Ввод числа" с возможностью вывода. Нужно сделать ввод числа с клавиатуры 8 знаков. Делаю ввод 66666660 получаю 66666664, 99999990 получаю 99999992, 99999999 получаю 100000000 ПОЧЕМУ??? Тип цифр LONG. Если использую Input number 2g, то вывод данных корректен.

Использую последнюю версию smlogix, которая мне предложила прошить smh2gi, я прошил ничего не изменилось.

Просьба помочь вопросе.
СМарт всегда вводит real и на выходе преобразует его в нужный тип. Предел точности real - 6 знаков.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie вне форума   Ответить с цитированием
Старый 17.07.2020, 15:16   #3
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: SМart блок "Ввод числа"

Цитата:
Сообщение от Arsie Посмотреть сообщение
Предел точности real - 6 знаков.
1) то есть в ситуации, когда мне нужно принять по смс и сохранить в real число 1234,567 - в младшем разряде у меня будет абракадабра?
2) Коректно ли сохранится в real число 1234,0 - если оно придет по смс как "П=1234", т.е. без запятой и нуля?
P.S.
Есть ли шанс сделать абракадабру предсказуемой или хотя бы безопасной? (ну, то есть, понять логику, с которой будет корежиться 7-я цифра в числе)
ailcat вне форума   Ответить с цитированием
Старый 17.07.2020, 16:21   #4
Ilya J.
Сотрудник Сегнетикс
 
Аватара для Ilya J.
 
Регистрация: Mar 2016
Адрес: SPb
Сообщения: 4 341
Благодарил(а): 0 раз(а)
Поблагодарили: 255 раз(а) в 251 сообщениях
По умолчанию Ответ: SМart. Разрядность блока "Ввод числа"

Эта тема дает исчерпывающий ответ на ваши вопросы?


__________________
Если ничто другое не помогает, прочтите, наконец, инструкцию
Ilya J. вне форума   Ответить с цитированием
Старый 18.07.2020, 16:32   #5
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: SМart блок "Ввод числа"

Цитата:
Сообщение от Ilya J. Посмотреть сообщение
Эта тема дает исчерпывающий ответ на ваши вопросы?
Только еще больше запутывает.
Дело в том, что общепринятой практикой для Float (соответствующему вашему 32-битному Real) является 7-значная мантисса, и классически диапазон допустимых значений определяется для неё. Но не в Сегнетиксе.


UPD:
Я бы не задал свой вопрос, если бы не столкнулся с вот этим:
Цитата:
Сообщение от Arsie Посмотреть сообщение
Предел точности real - 6 знаков.
Цитата:
Сообщение от Arsie Посмотреть сообщение
8 знаков на мантиссу
А мне нужно 7 знаков
.

Последний раз редактировалось ailcat, 18.07.2020 в 16:46
ailcat вне форума   Ответить с цитированием
Старый 20.07.2020, 11:22   #6
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 117
Благодарил(а): 15 раз(а)
Поблагодарили: 660 раз(а) в 604 сообщениях
По умолчанию Ответ: SМart блок "Ввод числа"

Цитата:
Сообщение от ailcat Посмотреть сообщение
Но не в Сегнетиксе.
Я ж написал, работает по стандарту. Привёл его номер. По нему же работают и все остальные машины, процессоры и т.д. Это уже де-факто полсотни лет и даже больше. Если вам в нём что-то не нравится, обратитесь я даже не знаю куда. Наверняка в преамбуле указаны его разработчики. Но я очень сомневаюсь, что весь мир под вас прогнётся

Если вы считаете, что float(32) даст вам 7 знаков и ваш опыт говорит, что это так - не проблема, используйте. Если работало на (тут список из миллиона производителей), будет работать и у нас.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie вне форума   Ответить с цитированием
Старый 20.07.2020, 12:36   #7
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: SМart блок "Ввод числа"

Цитата:
Сообщение от Arsie Посмотреть сообщение
Я ж написал, работает по стандарту
Даже если вы действительно соблюдали стандарт - то он допускает разное количество знаков мантиссы. И какую базу выбрали вы - одному черту известно (и вашему программисту).
Если в основе вашего Real лежит Float(32) из языка C/C++, то мантисса будет семизначной при лидирующей цифре от 0 до 7, и только при 8 и 9 - мантисса становится 6-значной (меня этот вариант полностью устраивает).
Если что-то другое - уже не факт (тот же С#, по крайней мере в известной мне довольно устаревшей версии, при 7-значной мантиссе допускают лидирующей цифрой только 1, в остальных случаях мантисса становится 6-значной).
P.S. Интересует именно в варианте для Matrix - у меня под рукой только SMH2, но у него другое ядро и, соответственно, результат может отличаться (так что на нем даже не проверял).

Ну и, в любом случае, я так и не получил на второй вопрос (ответ на него мало связан со стандартом, но сильно зависит от обработчика ввода на устройстве, того самого Input number):
какое число будет записано в Real при вводе "1234" вместо "1234,0"?
ailcat вне форума   Ответить с цитированием
Старый 20.07.2020, 12:42   #8
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 117
Благодарил(а): 15 раз(а)
Поблагодарили: 660 раз(а) в 604 сообщениях
По умолчанию Ответ: SМart блок "Ввод числа"

Цитата:
Сообщение от ailcat Посмотреть сообщение
Даже если вы действительно соблюдали стандарт
Да какое "даже". Математический блок в процессоре работает в этом стандарте. У нас даже выбора нет

При выводе на экран выведется 1234.0

Число 1234 не очень хороший пример, знаков мало. Вот с 12345657890 уже будут сильные проблемы.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.

Последний раз редактировалось Arsie, 20.07.2020 в 13:04
Arsie вне форума   Ответить с цитированием
Старый 20.07.2020, 16:35   #9
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: SМart блок "Ввод числа"

Цитата:
Сообщение от Arsie Посмотреть сообщение
Да какое "даже". Математический блок в процессоре работает в этом стандарте. У нас даже выбора нет
На какой процессор хоть доки искать? А то для одного и того же настольного Pentium4 компиляторы C++ и C# давали разный результат...

Цитата:
Сообщение от Arsie Посмотреть сообщение
При выводе на экран выведется 1234.0
Значит, дополняете - и это хорошо.

Цитата:
Сообщение от Arsie Посмотреть сообщение
Число 1234 не очень хороший пример, знаков мало.
Неее, для Float(32) это более чем хороший пример. Потому что без промежуточной коррекции (в древние времена зависело от настроек компилятора) оно нещадно корежилось, будучи записанным без ",0" в конце. У вас - с коррекцией, то есть можно не париться при вводе. А я с этим дерьмом в древнейшие времена сталкивался - перестраховываюсь.

Цитата:
Сообщение от Arsie Посмотреть сообщение
Вот с 12345657890 уже будут сильные проблемы.
Да ясен перец, вылазим за длину мантиссы.
Но у меня самое большое число - 7777,999 (цифры до запятой - режим работы 4-х реле, после запятой - время в минутах). СМС-ка состоит из 6 параметров (по числу групп из 4 реле). Чтоб заведомо вписаться в допустимую длину - увы, извращаемся (вместо "А1=1, B1=2, C1=3, D1=4, t1=999" пишем просто "П1=1234,999", аналогично П2...П6, и разбираем это в FBD)
ailcat вне форума   Ответить с цитированием
Старый 20.07.2020, 17:10   #10
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 785
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: SМart. Разрядность блока "Ввод числа"

Цитата:
Сообщение от ailcat Посмотреть сообщение
Даже если вы действительно соблюдали стандарт - то он допускает разное количество знаков мантиссы. И какую базу выбрали вы - одному черту известно (и вашему программисту).
Эта дура мантиса по стандарту вообще ничего не знает о ваших десятичных знаках. У нее 23 нормализованных двоичных разряда плюс всегда 1 в в мнимом 24-м.

Цитата:
Если в основе вашего Real лежит Float(32) из языка C/C++, то мантисса будет семизначной при лидирующей цифре от 0 до 7, и только при 8 и 9 - мантисса становится 6-значной (меня этот вариант полностью устраивает).
Точность представления числа в десятичном эквиваленте при нормализованной двоичной мантиссе естественно зависит от старшей цифры числа.

Цитата:
Если что-то другое - уже не факт (тот же С#, по крайней мере в известной мне довольно устаревшей версии, при 7-значной мантиссе допускают лидирующей цифрой только 1, в остальных случаях мантисса становится 6-значной).
Не понял - вообще для float32 это 7-8 десятичных знаков (суммарно до и после запятой) и порядок.
Цитата:
Но у меня самое большое число - 7777,999 (цифры до запятой - режим работы 4-х реле, после запятой - время в минутах). СМС-ка состоит из 6 параметров (по числу групп из 4 реле). Чтоб заведомо вписаться в допустимую длину - увы, извращаемся (вместо "А1=1, B1=2, C1=3, D1=4, t1=999" пишем просто "П1=1234,999", аналогично П2...П6, и разбираем это в FBD)
Ну даже теоретически не искажается

Но вот на кой хрен Вам простите вообще нужен float?

Последний раз редактировалось ATS, 20.07.2020 в 17:26
ATS вне форума   Ответить с цитированием
Старый 20.07.2020, 19:21   #11
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: SМart. Разрядность блока "Ввод числа"

Цитата:
Сообщение от ATS+ Посмотреть сообщение
Не понял - вообще для float32 это 7-8 десятичных знаков (суммарно до и после запятой) и порядок.
Нифига, есть тонкости из-за лидирующей цифры. Оно хорошо работает, только когда лидирует единица. Наелся этого в свое время (попробуйте вашу ссылку для 8388,608 - для разных компиляторов можно получить разный результат в последнем разряде).

Цитата:
Сообщение от ATS+ Посмотреть сообщение
Но вот на кой хрен Вам простите вообще нужен float?
1) его просто разбирать с помощью ФБД (с учетом мощности матрикса),
2) логику записи достаточно просто объяснить "рабочему классу" (главному отправителю смсок) - что даже важней.
ailcat вне форума   Ответить с цитированием
Старый 20.07.2020, 19:46   #12
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 785
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: SМart. Разрядность блока "Ввод числа"

Цитата:
Сообщение от ailcat Посмотреть сообщение
Нифига, есть тонкости из-за лидирующей цифры. Оно хорошо работает, только когда лидирует единица. Наелся этого в свое время (попробуйте вашу ссылку для 8388,608 - для разных компиляторов можно получить разный результат в последнем разряде). В последнем каком?
Ссылка дает это
2Gi - вот это 8388,6084.
Для 9999.999 тоже не искажает.

Цитата:
1) его просто разбирать с помощью ФБД (с учетом мощности матрикса),
2) логику записи достаточно просто объяснить "рабочему классу" (главному отправителю смсок) - что даже важней.
Лонг разобрать ничуть не сложнее. Уж если совсем плохо - вместо запятой можно использовать 0.
ATS вне форума   Ответить с цитированием
Старый 20.07.2020, 20:11   #13
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию Ответ: SМart. Разрядность блока "Ввод числа"

1. Хорошо, если так же будет и на матриксе
UPD: идиёты. Я вводил через запятую - получал NaN. Ну привык уже, что все современные проги и сайты либо приравнивают запятую и точку, либо явно ругаются на несоответствие. Даже у вас не сразу заметил правильный разделитель

2. Разобрать - да.
Объяснить, что нужно использовать ноль как разделитель кода и времени - из области фантастики (поверьте моему опыту). Особенно в связи с желанием не вводить лишние цифры (чаще всего дёргаемое вручную реле - правое в четверке цифр. Самое редкодергаемое - левое. Ноль, введенный явно или опущенный - означает "ничего не менять").

Последний раз редактировалось ailcat, 20.07.2020 в 20:25
ailcat вне форума   Ответить с цитированием
Старый 20.07.2020, 21:03   #14
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 785
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: SМart. Разрядность блока "Ввод числа"

Цитата:
Сообщение от ailcat Посмотреть сообщение
1. Хорошо, если так же будет и на матриксе
UPD: идиёты. Я вводил через запятую - получал NaN. Ну привык уже, что все современные проги и сайты либо приравнивают запятую и точку, либо явно ругаются на несоответствие. Даже у вас не сразу заметил правильный разделитель
Однозначно так и будет. Вот при восьми знаках уже могут быть чудеса.

Они не идиёты, стандарт у них такой.
floating point - я тоже привык к точке.

Цитата:
2. Разобрать - да.
Объяснить, что нужно использовать ноль как разделитель кода и времени - из области фантастики (поверьте моему опыту). Особенно в связи с желанием не вводить лишние цифры (чаще всего дёргаемое вручную реле - правое в четверке цифр. Самое редкодергаемое - левое. Ноль, введенный явно или опущенный - означает "ничего не менять").
Ну значит вообще без разделителя. Тоже не проблема.
ATS вне форума   Ответить с цитированием
Старый 20.07.2020, 21:26   #15
ailcat
Senior Member
 
Аватара для ailcat
 
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили: 2 раз(а) в 2 сообщениях
Talking Ответ: SМart. Разрядность блока "Ввод числа"

Цитата:
Сообщение от ATS+ Посмотреть сообщение
floating point - я тоже привык к точке
А я уже отвык за 17-то лет

Цитата:
Сообщение от ATS+ Посмотреть сообщение
Ну значит вообще без разделителя. Тоже не проблема.
Проблема. Угадайте, 12345 - это:
а) реле 0012 на 345 минут
б) реле 0123 на 450 минут
в) реле 1234 на 500 минут
ailcat вне форума   Ответить с цитированием
Старый 20.07.2020, 21:48   #16
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 785
Благодарил(а): 12 раз(а)
Поблагодарили: 194 раз(а) в 190 сообщениях
По умолчанию Ответ: SМart. Разрядность блока "Ввод числа"

Цитата:
Сообщение от ailcat Посмотреть сообщение
А я уже отвык за 17-то лет

Проблема проблемы. Угадайте, 12345 - это:
а) реле 0012 на 345 минут
б) реле 0123 на 450 минут
в) реле 1234 на 500 минут
Никакой проблемы - незначащие нули можно отбрасывать только слева по всем правилам для целого числа. Справа пусть от своей зарплаты отбрасывают - это поймут сразу.

Так что только вариант a)

Последний раз редактировалось ATS, 20.07.2020 в 22:00
ATS вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать свои сообщения

BB code is Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 10:44.


Версия vBulletin: 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Segnetics 2005 - 2024