Просмотр полной версии : Работа с переменной в 40 бит
Здравствуйте! Возникла такая трудность: принимаю с таймера значение длительности импульса в микросекундах в виде двоичного кода, т.е. 40 импульсов (0 и 1) с частотой 100 Гц, на быстродействующие входы, дальше мне полученные биты необходимо перевести в десятичное число обработать и сохранить, но я не могу найти переменную больше 32 бит (можно ли как то самому создать 40 битную переменную, ну ли 64 битную и работать с ней)?
можно, зависит от процессора, например интел 64-х битный точено сможет....
на интеле 64-х битном понятно, а в самом плк 110-60М, там проц. - RISC-процессор на базе ядра ARM-9, 32 разряда
Alizka наверное на этом стоит и остановиться, а заодно посмотреть типы переменных в CodeSys.
По крайней мере обрабатывать в десятичном виде то, что вы хотите в самом ПЛК вряд ли получится, максимум передать на уровень выше двумя или больше переменными.
Понятно. Спасибо большое! Я так и думал, просто хотелось убедиться (может что-то упустил). :)
А что вы хотите делать с 40-битным значением? Как то обрабатывать или просто выводить на экран?
В любом случае есть вариант - создавайте дополнительную переменную (возможно, в структуре) и инкрементируйте её по переполнению основного DWORD. При необходимости обработки или индикации накопленного значения смотрите, сколько значащих бит накопилось в дополнительной переменной и сдвигайте на это кол-во в основную DWORD с потерей младших разрядов. Далее преобразуете DWORD в REAL и уже его домножаете на коэффициент. Сдвигали на 4 бита - домножили на 16 и т. п.
Таким образом вы потеряете точность при индикации и при обработке, но не при накоплении.
VaBo, учитывая что там фигурируют и 0 и 1 то там участвует еще и время, что несколько осложняет процесс
Ага, невниматально прочитал вопрос, бывает ;)
Просто часто сталкивался с задачей, когда считают импульсы с водосчетчиков, к примеру, и в конце концов в сумматоре получают "замороженный" float...
Я плохо знаком с CDS, но разве нельзя создать union из двух dword и задвинуть туда с учетом переноса определенное число бит?
Если да, то в чем сложность далее обработать эти dword по отдельности с преобразованием во float с потерей точности?
Все зависит от задачи, если 7 значащих десятичных разрядов мантиссы достаточно, то почему нет?
ну, потеря нескольких бит, пока основная программа будет заниматься переносом из счетчика, точнее не пойми изчего. Быстрый вход используется только для ловли единиц, а там могут быть и нули.
например всего 10 бит 0100000101 (справа младший) - какое число будет в счетчике ? 3, а какое на самом деле ? - 261
А при 40-ка битах там 17 с лифигом миллиардов или даже больше. ой 549 755 813 888 - это только 1 в старшем разряде....
Владимир Ситников
11.12.2016, 01:24
Здравствуйте! Возникла такая трудность: принимаю с таймера значение длительности импульса в микросекундах в виде двоичного кода, т.е. 40 импульсов (0 и 1) с частотой 100 Гц, на быстродействующие входы, дальше мне полученные биты необходимо перевести в десятичное число обработать и сохранить, но я не могу найти переменную больше 32 бит (можно ли как то самому создать 40 битную переменную, ну ли 64 битную и работать с ней)?
А можно всё-таки "по-нормальному" озвучить задачу?
Какая конечная цель?
Что значит "работать с ней"?
Что значит 100Гц?
Это значит что приходит 100 бит в секунду?
Т.е. за первые 0.4сек мы прочитаем 40 бит, а куда потом девать приходящие данные?
Записывать по кругу на место "более старых"?
Если что, то для ПЛК110М02 есть инструментарий прямой обработки значений с быстрых входов (http://www.owen.ru/forum/showthread.php?t=22169&page=57&p=226390&viewfull=1#post226390) -- Hardella IDE.
Считывать нолики и единички из быстрого входа и записывать в биты -- вообще не вопрос.
Многие задачи "быстрого управления" можно сделать на Hardella "в лоб" и оно не подавится.
Есть плата с контроллером которая считает длительность между импульсами (между 10 импульсами или 100 - по выбору, на плате 10Мгц кварцевый генератор который по сути и определяет эту длительность, контроллер заполняет пять регистров по 8 бит именно с этого генератора), после этого эти пять регистров скидываются на gkr посредством такого вот подобия интерфейса, есть синхронизирующий сигнал с платы там выдается 40 импульсов с частотой 100 Гц и входной сигнал с заполненных регистров. Вот этот входной сигнал будет представлен набором 0 и 1 в количестве 40 штук, после этого полученное значение необходимо перевести на 100 или на 1000 для получения значения в мкс для определения длительности одного периода. Это значение используется далее в вычислениях, но это уже на компьютере (на компьютере ghuf не моя и я точно не знаю для каких).
Владимир Ситников
11.12.2016, 02:23
Есть плата с контроллером которая считает длительность между импульсами (между 10 импульсами или 100 - по выбору, на плате 10Мгц кварцевый генератор который по сути и определяет эту длительность, контроллер заполняет пять регистров по 8 бит именно с этого генератора), после этого эти пять регистров скидываются на gkr посредством такого вот подобия интерфейса, есть синхронизирующий сигнал с платы там выдается 40 импульсов с частотой 100 Гц и входной сигнал с заполненных регистров. Вот этот входной сигнал будет представлен набором 0 и 1 в количестве 40 штук, после этого полученное значение необходимо перевести на 100 или на 1000 для получения значения в мкс для определения длительности одного периода. Это значение используется далее в вычислениях, но это уже на компьютере (на компьютере ghuf не моя и я точно не знаю для каких).
Звучит так, что на Hardella можно "прочитать этот синхроимпульс и 40 бит".
Т.е. читаем 40 бит, пересылаем в КДС двумя 32 бит регистрами -- и там уже что хотим делаем.
PS А нельзя исходный сигнал завести на fast input и считать "количество импульсов за нужное количество мкс" (ну или эту "длительность между 100 импульсов")?
Или там реально несколько мегагерц на входе?
Или точности кварца внутри ПЛК не хватает?
Как мне объяснили: минимальная длительность периода 60 мкс (а это порядка 17кГц) максимальная около 60000 мс, точность определения им нужна вроде как с погрешностью 0,1 %.
Alizka а сигнал вы можете показать ? я так понимаю что есть и синхроимпульсы ?
то есть 40 импульсов равной длительности и значения 0 или 1 для каждого импульса. Или положение бита определяется строго по паузам (времени) ? а сам сигнал один ?
Владимир Ситников 110-60 разве уже M02 версия ?
Владимир Ситников
11.12.2016, 09:15
Как мне объяснили: минимальная длительность периода 60 мкс (а это порядка 17кГц) максимальная около 60000 мс, .
Импульсы более 21 секунды, неудобны, но сделать тоже можно.
60мкс -- без проблем. (На ПЛК110М02 можно и 1мкс обрабатывать)
Решать, конечно, вам, но, если можно обрабатывать сигнал напрямую с быстрого входа, то почему бы так не сделать? Зачем промежуточная плата?
точность определения им нужна вроде как с погрешностью 0,1 %
Тут, к сожалению, не могу сказать. ОВЕН говорит, что быстрые входы тактуются от кварца (если точнее, то быстрые входы подключены к сопроцессору, который тактуется на 200МГц от какого-то кварца), но какая там точность -- нужно измерять, проверять.
значения 0 или 1 для каждого импульса. По одному каналу - синхроинпульсы по другому - сигнал(0 и 1)
Alizka ПЛК успевает сбрасывать в массив биты ?
Владимир Ситников
30.12.2016, 13:03
Владимир Ситников 110-60 разве уже M02 версия ?
Ну, да.
На сайте owen.ru (http://www.owen.ru/catalog/programmiruemij_logicheskij_kontroller_oven_plk110/opisanie) модификация ПЛК110[М02]-60-К-L доступна для заказа:
28485
И, кстати, вот видео с реальным 110М02-60: https://www.youtube.com/watch?v=6ZInTYy5yTE
Так что, они существуют.
главное, чтобы он существовал у автора топика, а не где-то....
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot