PDA

Просмотр полной версии : Master OPC с ПЛК63 преобразование DWord в Uint32



exemption
20.03.2019, 10:51
Добрый день. Помогите пожалуйста отобразить корректно переменную контроллера в Master OPC.
Имеется переменная в контроллере DWORD (-30,70). На стороне сервера считывается как:
4685839 (при перестановке старшим байтом вперед);
2148466759 (при перестановке старшим словом вперед).

Мастеренко Иван
20.03.2019, 16:42
Добрый день!
Uint32 (Dword) - целое беззнаковое число (диапазон 0..4294967295). Если нужно передать -30,70 используйте Float.
Отличие Uint от Word можно почитать здесь (http://www.owen.ru/forum/showthread.php?t=28167&page=3&p=271057&viewfull=1#post271057)

exemption
21.03.2019, 09:00
Добрый день!
Uint32 (Dword) - целое беззнаковое число (диапазон 0..4294967295). Если нужно передать -30,70 используйте Float.
Отличие Uint от Word можно почитать здесь (http://www.owen.ru/forum/showthread.php?t=28167&page=3&p=271057&viewfull=1#post271057)

В проекте уже задействована переменная dword, где она по умолчанию задана как -30;95, ее можно поменять непосредственно на контроллере. Вопрос в том, как корректно отобразить ее на opc.

melky
21.03.2019, 09:20
exemption 82-й регистр это переменная Real (с этого регистра начинаются real переменные в конфигурации ПЛК), обзовите его как хотите, а прочитать и изменить по сети его можно как float, последовательность байт 2301

Да, в служебной области памяти, где возможен групповой запрос адреса регистров для этой переменной (82-83 регистры) будет 4176-4177

exemption
21.03.2019, 13:07
exemption 82-й регистр это переменная Real (с этого регистра начинаются real переменные в конфигурации ПЛК), обзовите его как хотите, а прочитать и изменить по сети его можно как float, последовательность байт 2301

Да, в служебной области памяти, где возможен групповой запрос адреса регистров для этой переменной (82-83 регистры) будет 4176-4177

Правильно ли я понимаю что мне необходимо указать тип данных как на сервере, так и на устройстве float? В таком случае, считывая 82 регистр, я получаю значение 0 (перестановка старшим байтом вперед), что не соответствует действительности.

PS Исходная переменная является точкой графика, нашел в коде программы следующие строки:

" (*Старшие 2 байта - Y, младшие 2 - X*)
(*У отрицательных чисел выставлен старший бит, т.е. !не-инвертированный код!*)
Y := DWORD_TO_INT(Pnt / 16#10000);
IF Y < 0 THEN
Y := - DINT_TO_INT(16#8000 + Y);
END_IF;
X := DWORD_TO_INT(Pnt AND 16#FFFF);
IF X < 0 THEN
X := - DINT_TO_INT(16#8000 + X);
END_IF; "

melky
21.03.2019, 13:12
блин, на не надо ничего менять на устройстве, в самом регистре там давно real (float), вам же просто его читать. переставлять вроде только регистры необходимо

з.ы. вроде фиолетово, что у вас там в коде. У ПЛК63/73 регистры под разные типы данных прописаны в документации вроде. с 82-го идут float пользовательские.

Ну да, судя по скриншоту ОРС сервера указать и для устройства и для сервера float, стартовый регистр 4176 и потом поменять регистры.

Почему на скриншоте 8 байт переставляете при переменной Uint32 ?
поставьте float и 2301 последовательность байт

exemption
21.03.2019, 13:45
Почему на скриншоте 8 байт переставляете при переменной Uint32 ?
поставьте float и 2301 последовательность байт

OPC, при при выключенной перестановке байтов устройства, предлагает 8 байтов для перестановки.
Прикладываю 3 скриншота, в окне я могу самостоятельно задать порядок 8-ми байтов или выбрать представленные варианты.
Результат по всем скриншотам, считанное значение =0

melky
21.03.2019, 14:35
Вот тут не подскажу, с их ОРС не работаю. Удивлен, что при наличии 4-х байтной переменной просит переставлять 8 байт... типа напуркуа ?