PDA

Просмотр полной версии : Измеритель СП-270



Andy86-j
21.12.2019, 15:03
Столкнулся с такой проблемой. В каком формате надо передавать число, чтобы оно отобразилось на измерителе?
Я хочу отобразить на нем число в диапазоне 23025-138155. Пробовал передавать в формате dword и real. Стрелка в начале передачи(в этот момент передается число в районе 40000-50000) сразу уходит в максимум. Мне кажется, что дело в форме передачи - значения в панель передаются через string output module, в котором записывается сразу пачка регистров. При этом адресу этой команды соответствует массив ARRAY[0..сколько то там]TO REAL. Вот здесь вопрос - если я в программе число в формате DWORD записываю в переменную zapispanel[0], которая является частью массива ARRAY[]TO REAL она автоматом никак в REAL не переводится.? Т.е. понятно, что в REAL формате это число тоже какое-то значение имеет, но положение битов при такой записи не может сконвертироваться?

Godlike_S
21.12.2019, 17:25
Формата Real в данном случае не хватит, нужен dword, но не совсем понятно что и куда вы пишете (кто и в каком формате отправляет данные). Можно подробности?

Andy86-j
21.12.2019, 20:04
Формата Real в данном случае не хватит, нужен dword, но не совсем понятно что и куда вы пишете (кто и в каком формате отправляет данные). Можно подробности?
Не очень понял про real. Там же до 3.4*10 38 степени значения могут быть. dword в этом плане как понимаю даже менее объемен.
По записи. Есть мастер -ПЛК овен. По сети RS-232 с ним связана панель. Обмен с панелью веду строковыми функциями конфигуратора(так выходит быстрее). Т.е. строкой string input/output module оправшиваю/записываю в панель числа в word и real форматах. В измеритель как и писал выше хочу послать число, которое больше, чем позволяет послать word переменная. Поэтому пытаюсь послать число dword. В объявлении переменных есть массив ARRAY[0..сколько то..не помню]OF REAL. ему присвоен адрес строкового запроса. Соответственно, в один из элементов массива записываю число в формате dword. Далее эта строка передается в панель. Все другие записанные данные читаются правильно, но они имеют формат real. А вот число dword в измеритель похоже не доходит или доходит неверно.
P.S. Надо в панели, видимо, добавить дисплей и посмотреть, как эти 2 регистра с этим числом выглядят на нем.
P.S.2 Пока писал - подумал, что надо просто число на 10 поделить и тогда все передастся в формате word.

Godlike_S
22.12.2019, 00:18
Не очень понял про real. Там же до 3.4*10 38 степени значения могут быть. dword в этом плане как понимаю даже менее объемен.


Про REAL прошу прощения, читал с телефона и понял границы за общее число )))



По записи. Есть мастер -ПЛК овен. По сети RS-232 с ним связана панель. Обмен с панелью веду строковыми функциями конфигуратора(так выходит быстрее). Т.е. строкой string input/output module оправшиваю/записываю в панель числа в word и real форматах. В измеритель как и писал выше хочу послать число, которое больше, чем позволяет послать word переменная. Поэтому пытаюсь послать число dword. В объявлении переменных есть массив ARRAY[0..сколько то..не помню]OF REAL. ему присвоен адрес строкового запроса. Соответственно, в один из элементов массива записываю число в формате dword. Далее эта строка передается в панель. Все другие записанные данные читаются правильно, но они имеют формат real. А вот число dword в измеритель похоже не доходит или доходит неверно.

Ну как бы форматы DWORD и REAL немного разные, если в первом случае в 4-х байтах содержится все число, то в последнем в каких то двух число, а в каких то положение плавающей запятой, причем порядок чередования байт может быть различным (старшим байтом вперед/младшим байтом вперед), различным может быть и порядок чередования регистров. И наверное если мы запишем DWORD в массив а потом будем читать как REAL то получим не то, что хотели...

Godlike_S
22.12.2019, 00:18
[QUOTE=Andy86-j;321608] Вот здесь вопрос - если я в программе число в формате DWORD записываю в переменную zapispanel[0], которая является частью массива ARRAY[]TO REAL она автоматом никак в REAL не переводится.? /QUOTE]
Конечно же нет.

petera
22.12.2019, 10:19
[QUOTE=Andy86-j;321608] Вот здесь вопрос - если я в программе число в формате DWORD записываю в переменную zapispanel[0], которая является частью массива ARRAY[]TO REAL она автоматом никак в REAL не переводится.? /QUOTE]
Конечно же нет.

Как раз таки автоматом и перевелось!
т.е.
46321

Здесь переменную DWORD
CONST1:= 138155;
пытаемся передать в панель через string output module
Присвоим элементу массива значение переменной
zapispanel[0]:= CONST1;

Если в zapispanel[0] находится не преобразованное, DWORD, значение 138155 == 0х21BAB то логично, что в Stringe должны быть три символа ответствующие байтам 02, 1В, АВ
Теперь посмотрим, что же в Stringe получилось
46322

Ак$06H --> <C0><EA><06><48>
Ай-яй-яй! Там совсем другие символы!
И что они обозначают? Они - есть отображение байтов числа 138155 в Float формате 138155 == 0x4806EAC0!
Проверим в калькуляторе http://www.binaryconvert.com/result_float.html?decimal=049051056049053053
46323
Единственное отличие - порядок байт обратный, но если ТС говорит что все другие Float переменные из массива отображаются на дисплеях панели нормально, то обратный порядок байт - это нормально

И в панель число попадет в формате Float
А как известно для Измерителя в панели нельзя выбрать формат Float
Потому и не работает

petera
22.12.2019, 10:38
В дополнение
Вариант с преобразованием Float в Dword в панели

В примере данные из ПЛК приходят в PSW256 как Float
В измерителе используется регистр PSW1000
Конвертер Float --> DWord выполнен ГМ
46325 46326
https://owen.ru/forum/attachment.php?attachmentid=46327&d=1577000723
Копи/пасте ГМ из примера в свой проект, настроить адреса в конвертере

ЗЫ
В конвертере диапазон значения Float ограничен значениями - от 0 до 10 000 000

Godlike_S
22.12.2019, 11:18
[QUOTE=Godlike_S;321643]

Как раз таки автоматом и перевелось!

А, я кажется понял в чем прикол. В Кодесис 3.5 приходиться делать некое подобие для передачи и приема Float...

petera
22.12.2019, 11:19
Вариант с преобразованием в программе ПЛК
Будем использовать указатель
46328

Сначала получим адрес в памяти ПЛК где лежит элемент массива
pt:= ADR(zapispanel[0]);

И поместим по этому адресу переменную DWORD, как DWord
pt^:= CONST1;

В панели ничего преобразовывать не надо, только один этот элемент придет как настоящий DWord, остальные элементы массива останутся Float
В настройках измерителя выбирать нужный регистр и формат DWord

Andy86-j
23.12.2019, 09:17
Вариант с преобразованием в программе ПЛК
Будем использовать указатель
46328

Сначала получим адрес в памяти ПЛК где лежит элемент массива
pt:= ADR(zapispanel[0]);

И поместим по этому адресу переменную DWORD, как DWord
pt^:= CONST1;

В панели ничего преобразовывать не надо, только один этот элемент придет как настоящий DWord, остальные элементы массива останутся Float
В настройках измерителя выбирать нужный регистр и формат DWord
Спасибо за разъяснение и варианты решения.