Segnetics

Вернуться   Segnetics > Форум Segnetics > Вопросы о программировании

Вопросы о программировании Вопросы, касающиеся программирования на FBD

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.03.2015, 02:20   #1
smakoveev
Новичок
 
Регистрация: Apr 2007
Сообщения: 4
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию 64-разрядное число

Добрый день.
По ModBus от внешнего устройства на контроллер приходит информация в виде 64-разрядного целого числа. Размер 4 байта. Тип: Int64.
Необходимо это число вывести на дисплей контроллера.
Возможна ли в лоджике реализация такого процесса?
smakoveev вне форума   Ответить с цитированием
Старый 15.03.2015, 07:32   #2
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата Необходимо это число вывести на дисплей контроллера.
Стандартными решениями вряд ли получится. У сегнетикса нет механизмов обработки 64-битного числа. Далее начинаются танцы с бубнами. Зависит от формата числа - знаковое/без знаковое, диапазона (укладывается ли в 32 разряда), в ряде случаев можно обойтись малой кровью. Если нужно решение задачи в общем случае, надо смотреть как обрабатывают 8 битные контроллеры 32 битные числа и идти аналогичным путем. Смысл обработки - разбить 1 64-битное число на 2 32-битных или 4 16-битных и выводить их на экран друг за другом. Задача в принципе реализуемая на FBD, но крайне ресурсоемкая. Отдельным вопросом стоит время выполнения такой задачи. Поскольку в FBD нет циклов, то штатными средствами эта операция займет 32 тика или около 3,2 с.


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.

Последний раз редактировалось tvf, 15.03.2015 в 07:48
tvf вне форума   Ответить с цитированием
Старый 15.03.2015, 10:48   #3
SMH
НЕ сотрудник Segnetics
 
Аватара для SMH
 
Регистрация: Feb 2006
Сообщения: 540
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от tvf Посмотреть сообщение
Поскольку в FBD нет циклов, то штатными средствами эта операция займет 32 тика или около 3,2 с.
Што-што?


__________________
BANNED
SMH вне форума   Ответить с цитированием
Старый 15.03.2015, 11:54   #4
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата Што-што?
Ну тут немного погорячился. Но только немного. Любые рекуррентные вычисления можно делать или с помощью цикла или линейным образом. Первое экономит размер программы, второе время вычисления. FBD не имеет штатных средств организации цикла внутри тика. Так что время выполнения 1 прохода цикла = времени тика.

Что до сути вопроса. Более внимательное осмысливание вопроса привело к следующему алгоритму:
1. 64-битное число выводится на экран как несколько 16-битных чисел.
2. Каждое 16-битное число имеет диапазон от 0 до 9999 - 4 десятичных разряда
3. Средствами двоичной арифметики 64-битное число делится на 10000.
4. Остаток от деления записывается в младшее число.
5. Частное опять делится на 1000. Остаток записывается в следующее число и так далее.

Во вложении пример такого алгоритма. Для простоты ограничился 16-битным числом и размерностью 3 десятичных разряда. Работает только для положительных чисел. Отрицательные требуют изменения формата записи к прямому виду.
Вложения
Тип файла: psl Пример.psl (106.5 Кбайт, 53 просмотров)


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.
tvf вне форума   Ответить с цитированием
Старый 15.03.2015, 12:05   #5
VaBo
Senior Member
 
Регистрация: Apr 2012
Сообщения: 111
Благодарил(а): 2 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от smakoveev Посмотреть сообщение
Добрый день.
По ModBus от внешнего устройства на контроллер приходит информация в виде 64-разрядного целого числа. Размер 4 байта. Тип: Int64.
Необходимо это число вывести на дисплей контроллера.
Возможна ли в лоджике реализация такого процесса?
Просто ради интереса, скажите, количество ЧЕГО описывается 64-битным числом?
VaBo вне форума   Ответить с цитированием
Старый 15.03.2015, 17:03   #6
СВМ
Senior Member
 
Регистрация: Jan 2012
Адрес: Саратов
Сообщения: 179
Благодарил(а): 1 раз(а)
Поблагодарили: 3 раз(а) в 3 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от smakoveev Посмотреть сообщение
Добрый день.
По ModBus от внешнего устройства на контроллер приходит информация в виде 64-разрядного целого числа. Размер 4 байта. Тип: Int64.
Необходимо это число вывести на дисплей контроллера.
Возможна ли в лоджике реализация такого процесса?
Всё-таки какое число? 64 разряда - это 8 байт. А 4 байта - это 32 разряда.
СВМ вне форума   Ответить с цитированием
Старый 15.03.2015, 21:46   #7
coverart
Senior Member
 
Регистрация: Mar 2008
Адрес: Екатеринбург
Сообщения: 492
Благодарил(а): 50 раз(а)
Поблагодарили: 14 раз(а) в 13 сообщениях
По умолчанию Ответ: 64-разрядное число

Интересно еще что за модбас устройство изрыгает 64 разряда?
coverart вне форума   Ответить с цитированием
Старый 15.03.2015, 22:59   #8
smakoveev
Новичок
 
Регистрация: Apr 2007
Сообщения: 4
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: 64-разрядное число

Это устройство: электросчетчик SE iEM3155.
В нем все данные, как то:напряжение, ток, частота передаются в нормальном для контроллера виде float32 с размером данных в int16=2.
И только значение полной энергии выдается в int64 c размером =4.
Мне посоветовали разбить данное число на четыре 16 битных числа. Но в конечном результате у меня никак не получилось совпадения показаний на экране счетчика и экране контроллера.
Время обновления информации на дисплее контроллера принципиального значения не имеет. Хоть один раз в несколько минут.
Контроллер используемый для этих целей: SMH2gi.

Последний раз редактировалось smakoveev, 15.03.2015 в 23:15
smakoveev вне форума   Ответить с цитированием
Старый 16.03.2015, 06:30   #9
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата Мне посоветовали разбить данное число на четыре 16 битных числа. Но в конечном результате у меня никак не получилось совпадения показаний на экране счетчика и экране контроллера.
Простое разбиение 64 битного числа на 4 16 битных ни чего не даст. Надо что бы каждое 16 битное число отражало определенное число десятичных разрядов первоначального 64 битного. Максимальное число десятичных разрядов для 16 битного - 4. Так что надо делить на 10000. Число таких чисел - 5. Стандартных математических операций для 64 бит в лоджике нет. Так что делить надо по правилам двоичной арифметики.


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.
tvf вне форума   Ответить с цитированием
Старый 16.03.2015, 12:42   #10
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от smakoveev Посмотреть сообщение
Это устройство: электросчетчик SE iEM3155.
В нем все данные, как то:напряжение, ток, частота передаются в нормальном для контроллера виде float32 с размером данных в int16=2.
И только значение полной энергии выдается в int64 c размером =4.
Мне посоветовали разбить данное число на четыре 16 битных числа. Но в конечном результате у меня никак не получилось совпадения показаний на экране счетчика и экране контроллера.
Время обновления информации на дисплее контроллера принципиального значения не имеет. Хоть один раз в несколько минут.
Контроллер используемый для этих целей: SMH2gi.
Кстати, попробуйте все 4 int16 отправить в часть программы, написанную на С++. В С++ есть 64-битная математика, там эти int16 сшить в один int64, далее делениями разбить этот int64 на множество int16, каждый из которых будет содержать один разряд исходного числа.

Ну например:

1) Приходит абракадабра в виде четырёх int16

2) Шмемами отправляем эту абраобразную кадабру в С++

3) Там двоично сшиваем кадабру в нормальный int64

4) Максимальное значение беззнакового int64: 18446744073709551615, т.е. 20 разрядов. Организуем цикл 0..19, в котором делением на 10 откусываем по одному младшему разряду и отправляем этот разряд в свой шмем. Всего 20 шмемов в формате int16

5) На экран эти шмемы выводим в линеечку, получив исходное int64 в десятичном виде

2Gi это переварит в реальном времени даже не поперхнувшись.


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

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie вне форума   Ответить с цитированием
Старый 16.03.2015, 13:23   #11
smakoveev
Новичок
 
Регистрация: Apr 2007
Сообщения: 4
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: 64-разрядное число

попробуйте все 4 int16 отправить в часть программы, написанную на С++.

Арсений, конечно большое спасибо за совет, но к своему стыду я только знаю что есть такой язык программирования как С++ и все...
По большому счету мне совершенно не нужен результат с 20-разрядным числом. Я на пенсию уже уйду, а счетчик до этого результата не досчитает. Получиться считать первую десятку и то за глаза.
smakoveev вне форума   Ответить с цитированием
Старый 16.03.2015, 13:39   #12
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от smakoveev Посмотреть сообщение
попробуйте все 4 int16 отправить в часть программы, написанную на С++.

Арсений, конечно большое спасибо за совет, но к своему стыду я только знаю что есть такой язык программирования как С++ и все...
По большому счету мне совершенно не нужен результат с 20-разрядным числом. Я на пенсию уже уйду, а счетчик до этого результата не досчитает. Получиться считать первую десятку и то за глаза.
Тогда с помощью вот такой схемы выводите нижние 32 разряда. Какие два из четырёх int16 подключать на вход схемы - нужно подобрать методом тыка.
Миниатюры
Нажмите на картинку для увеличения

Название:  Безымянный.PNG
Просмотров: 116
Размер:  6.4 Кбайт  


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

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie вне форума   Ответить с цитированием
Старый 16.03.2015, 13:53   #13
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата По большому счету мне совершенно не нужен результат с 20-разрядным числом. Я на пенсию уже уйду, а счетчик до этого результата не досчитает.
Может и не успеете. Единица измерения в счетчике - Вт/ч. Максимальное положительное число в long примерно 2 000 000. Так что имеет максимальное отображаемое число 2 000 кВт/ч. Дальше считайте сами.

Ну и еще 1 нюанс. В счетчике беззнаковое число. В контроллере - знаковое число. Так что старший разряд надо принудительно выставить в 0.


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.
tvf вне форума   Ответить с цитированием
Старый 16.03.2015, 15:37   #14
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 740
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата:
Сообщение от Arsie Посмотреть сообщение
Тогда с помощью вот такой схемы выводите нижние 32 разряда. Какие два из четырёх int16 подключать на вход схемы - нужно подобрать методом тыка.
Так просто вроде не получится из-за знаков...

Общий вариант упаковки беззнакового INT64 в Real (float32) получится примерно так.
int64-real.msl
Но на больших числах будем перевирать младшие разряды...
И для этой задачи можно поделить все получаемые long перед переводом в real на 100 и окончательный результат поделить на 10 чтобы получить результат в kWh. Кстати и число исходных обрабатываемых разрядов можно уменьшить до 37 исходя из максимума прибора 99999999999 Wh.

Пересобрать можно по аналогии и из трех младших int16

Последний раз редактировалось ATS, 16.03.2015 в 15:51
ATS вне форума   Ответить с цитированием
Старый 16.03.2015, 16:13   #15
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от ATS Посмотреть сообщение
Так просто вроде не получится из-за знаков...
Да, блин. Промахнулся со знаками. Забыл совсем о них.


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

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie вне форума   Ответить с цитированием
Старый 16.03.2015, 18:18   #16
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 019
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата:
Сообщение от Arsie Посмотреть сообщение
Да, блин. Промахнулся со знаками. Забыл совсем о них.
Вот это нативный способ.
Миниатюры
Нажмите на картинку для увеличения

Название:  Безымянный.PNG
Просмотров: 121
Размер:  9.0 Кбайт  


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

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

Последний раз редактировалось Arsie, 17.03.2015 в 12:12
Arsie вне форума   Ответить с цитированием
Старый 16.03.2015, 20:35   #17
VaBo
Senior Member
 
Регистрация: Apr 2012
Сообщения: 111
Благодарил(а): 2 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от tvf Посмотреть сообщение
Может и не успеете. Единица измерения в счетчике - Вт/ч. Максимальное положительное число в long примерно 2 000 000.
Беззнаковый лонг - 4 294 967 295.
VaBo вне форума   Ответить с цитированием
Старый 16.03.2015, 22:28   #18
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 740
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от ATS Посмотреть сообщение
И для этой задачи можно поделить все получаемые long перед переводом в real на 100 и окончательный результат поделить на 10 чтобы получить результат в kWh.
Что-то я тут бред какой-то написал. Не надо так делать - делим результат на 1000.
ATS вне форума   Ответить с цитированием
Старый 16.03.2015, 23:29   #19
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 740
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата
Сообщение от VaBo Посмотреть сообщение
Беззнаковый лонг - 4 294 967 295.
Да где его взять?
Цитата:
Сообщение от Arsie Посмотреть сообщение
Вот это нативный способ.
До 2147483.6 kWh вполне подойдет.Только перед выводом на дисплей поделить на 100, а точку перед десятыми графикой нарисовать.
ATS вне форума   Ответить с цитированием
Старый 17.03.2015, 07:57   #20
tvf
Senior Member
 
Регистрация: Dec 2011
Сообщения: 741
Благодарил(а): 1 раз(а)
Поблагодарили: 9 раз(а) в 9 сообщениях
По умолчанию Ответ: 64-разрядное число

Цитата Беззнаковый лонг - 4 294 967 295.
Ну ошибся на 3 порядка. Бывает.


__________________
Нет абсолютно бездарных людей. Каждый бездарен в своей области.

Последний раз редактировалось Arsie, 17.03.2015 в 12:12
tvf вне форума   Ответить с цитированием
Старый 17.03.2015, 09:22   #21
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 740
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: 64-разрядное число

Ссылочка попалась.

Последний раз редактировалось Arsie, 17.03.2015 в 12:13
ATS вне форума   Ответить с цитированием
Старый 17.03.2015, 13:56   #22
ATS
Senior Member
 
Регистрация: Aug 2013
Сообщения: 3 740
Благодарил(а): 12 раз(а)
Поблагодарили: 192 раз(а) в 188 сообщениях
По умолчанию Ответ: 64-разрядное число

Как ни странно тоже потребовалось с прибора (теплосчетчик МКТС) итоги в виде FLOAT64 получить.
Получилось примерно так float64-real.msl
Естественно с понижением...
ATS вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разложить число на множители (решено) VaBo SMLogix 6 27.03.2019 18:24
Число Real: уменьшить кол-во знаков после запятой dima Вопросы о программировании 4 01.06.2017 20:50
Внести число в Журнал stanislav SMArt 11 13.04.2012 16:42


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


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