Два word в dword

        short val1 = short.MaxValue;
        short val2 = short.MaxValue;

        int result = val1;
        result |= val2 << 16;

        Console.WriteLine( "Result =t" + result );         //2147450879
        Console.WriteLine( "Expected =t" + int.MaxValue ); //2147483647

asked Dec 17, 2009 at 15:56

jack-london's user avatar

2

short is signed, so the maximum value is 0x7FFF. Concatenated this results in 0x7fff7fff instead of 0x7fffffff which is 2147450879. So what you’re seeing is actually correct.

answered Dec 17, 2009 at 16:00

Joey's user avatar

JoeyJoey

341k85 gold badges687 silver badges681 bronze badges

1

That looks like C#. Short is signed. A signed negative value extended to int will fill all the leftmost 16 bits. Thus, the proposed code will fail whenever «val1» is negative.

This code works (note that WORD and DWORD are unsigned quantities):

  public static uint MakeDWord(ushort a, ushort b) {
    return ((uint)a << 16) | b;
  }

answered Dec 17, 2009 at 16:09

Jon Watte's user avatar

Jon WatteJon Watte

6,3374 gold badges49 silver badges61 bronze badges

1

This is what you need

        ushort val1 = ushort.MaxValue;
        ushort val2 = ushort.MaxValue;

        int result = val1;
        result |= val2 << 15;

answered Dec 17, 2009 at 16:04

Fredou's user avatar

FredouFredou

19.7k10 gold badges58 silver badges113 bronze badges

2

try this, similar to MAKEWORD in < windef.h >:

#define MAKEDWORD(_a, _b)   ((DWORD)(((WORD)(((DWORD_PTR)(_a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(_b)) & 0xffff))) << 16))

answered Nov 22, 2011 at 6:29

jichi's user avatar

jichijichi

6,1151 gold badge31 silver badges25 bronze badges

Мои исследования, если кому интересно будет:
— структура из разнородных массивов, т.е. структура в которую входит массив из 10 word-ов, за ним еще массив из 10 word-ов, за ним еще массив уже из 10 DWord-oв функция MB_SERVER не смогла переварить (хотя компилирование и загрузка успешны), по-крайней мере со стороны клиента выдается сообщение, что не может открыть сессию. Может это и у нас такой modbus TCP клиент.
— serialize/deserialize: функции хорошие. Но ситуация следующая, чтобы сделать то что я хочу, а это из массива на 1024 слова выдернуть нужные слова (учитывая, что 2 слова — это одно real значение) и переконвертировать в real-значения. Сделал функцию в которой берется массив из 12 слов (6 real значений), пропускается через функцию serialize, получается фарш из 24 байт, потом пропускаю эти 24 байта через функцию deserialize и записываю в массив из 6 real (можно в массив из 6 dword, если кому надо, а потом пропускать через CONV). Какие недостатки такой реализации в моем случае, поскольку real значения в буфере хранятся, неправильным для меня образом, два последовательных слова надо менять местами, чтобы получилось правильное real значение, приходится делать предварительную обработку. Кроме этого надо из основного буфера на 1024 слова выдергивать необходимые слова в промежуточный буфер, который подается на serialize. В общем, по итогу, сделать можно, но муторно.
— написал небольшой скрипт на SCL
#temp_dword := #input_1;
#temp_dword := SHL(IN := #temp_dword, N := 16);
#temp_dword := #temp_dword OR #input_2;
#output := DWORD_TO_REAL(#temp_dword);
Т.е. беру два слова, первое слово сдвигаю на 16 бит, делаю логическое или между двумя словами, соответственно получается на выходе DWORD в котором упакованы два слова, затем преобразовываем двойное слово в real значение.

Все это поскольку, скада самописная.

P.S. если честно, извиняюсь и понимаю что на форуме это не принято, но «заипа..и эти самописные скады», потом занимаешься каким-то… :)

Этот функциональный блок позволяет преобразовать две переменные WORD в переменной DWORD. Операнд MSW передается старшим битам 16, операнд LSW передается в младшие биты 16 Out.

Функциональная блокировка
CODESYS: Не доступно
LogicLab: eLLabUtyLib

MSW (WORD) MSW выходного значения.

LSW (WORD) LSW выходного значения.

Out (DWORD) Исходящее значение.

FB_WordToDouble

примеров

Как пользоваться примерами.
В примере две переменные WORD со значением 16 # 1234 и 16 # 5678 переносятся в переменную DWORD результат будет 16 # 12345678. В примере на языке ST подчеркнуто, что та же самая операция намного проще, написав ее непосредственно с операндами языка.

LogicLab (Ptp114)

PROGRAM ST_WordToDouble
VAR
    High : WORD := 16#1234; (* MSW word *)
    Low : WORD := 16#5678; (* LSW word *)
    Result : ARRAY[ 0..1 ] OF DWORD; (* Compress result *)
    WCom : WordToDouble; (* Word compress *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_WordToDouble"
// *****************************************************************************
// This program shows the use of WordToDouble function block.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // COMPRESS WORD
    // -------------------------------------------------------------------------
    // Compress byte using the FB.

    WCom(MSW:=High, LSW:=Low);
    Result[0]:=WCom.Out; //Compress result

    // -------------------------------------------------------------------------
    // COMPRESS WORD
    // -------------------------------------------------------------------------
    // The same operation as above executed directly using ST statements.

    Result[1]:=(High*16#10000)+Low; //Compress result

// [End of file]

Была ли эта статья полезна?

Где это встречается?

Большинство программистов в наше время пишут код без понятия, что происходит там «под капотом», банально как хранятся в памяти те или иные типы переменных и у них это не вызывает никаких проблем. А что будет, если оставить только базовые операторы?

Дано: некий измерительный преобразователь отправляет float по протоколу modbus в виде двух регистров word, мы их получаем на ПЛК.
Задача: полученные два слова сконвертировать обратно в float.

Float по стандарту IEE754

Стандарт IEE754 определяет как представлять отрицательные и положительные числа с плавающей точкой. Множество статей в интернете описывает тонкости это стандарта с приложенными математическими формулами и подробным описаниям.

Битовое представление числа с плавающей точкой<br />
Битовое представление числа с плавающей точкой

Самое главное, что нам нужно знать из этого стандарта:

  • float это 32 бита
  • где 1-й бит — знак, следующие 8 — порядок, последние 23 — мантисса
  • зная эти данные и подставив их в формулу можно получить искомое значение

Как обычно это решается?

Обычно это решается быстро и легко через указатели или через встроенные функции конвертации. Что в принципе не требует знаний о стандарте.

Я же за неимением онного использовал битовые операции.

Решение с помощью битовых операций

Зная формат, несложно получить знак, порядок и мантиссу из битового представления числа. Делается это с помощью нескольких битовых масок. Затем полученные числа подставляются в формулу и вычисляется результат.

PROGRAM PLC_PRG
VAR real_dword, sign, mant, expb, bmask1, bmask2, bmask3: DWORD;
word1_input, word2_input: WORD;
float_output, signf, expf: REAL;	
	mantf: REAL;
END_VAR

word1_input := 11047;
word2_input := 16964;
bmask1 := 16#FF;
bmask2 := 16#7FFFFF;
bmask3 := 16#800000;
(* Складываем два слова в одно двойное *)
real_dword := SHL(WORD_TO_DWORD(word2_input), 16) + WORD_TO_DWORD(word1_input);
(* Находим знак *)
sign := SHR(real_dword, 31);
IF sign > dword#0 THEN
    signf := -1.0;
ELSE
    signf := 1.0;
END_IF;
(* Находим порядок *)
expb := SHR(real_dword, 23) AND bmask1;
(* Находим мантиссу *)
IF(expb <> dword#0 ) THEN
    mant := (real_dword AND bmask2)  OR bmask3;
ELSE
    mant := SHL((real_dword AND bmask2), 1);    
END_IF;
(* Подставляем полученные данные в формулу *)
mantf := (DWORD_TO_REAL(mant)) * (EXPT(REAL#2.0, DINT#-23));
expf := expt(real#2.0 , dword_to_dint(expb - dword#127));

float_output := signf *  expf * mantf;

Этот код немного отличается от изначального, который я писал для AXC 1050 в PC Worx, из-за невозможности протестировать его на сегодняшний день нигде кроме эмулятора в CodeSys.

Это несущественно, разница лишь в способе объявления переменных

Чем можно проверить свое решение

Пока гуглил все эти стандарты и способы решений, нашел один интересный Excel документ от Schneider Electric. С его помощью вы можете быстро проверить свое решение.

MrPLC.com sells used surplus products. MrPLC.com is not an authorized distributor, affiliate, or representative for the brands we carry. Products sold by MrPLC.com come with MrPLC.com’s 1-year, 2-year, or 3-year warranty and do not come with the original manufacturer’s warranty. Designated trademarks, brand names and brands appearing herein are the property of their respective owners. This website is not sanctioned or approved by any manufacturer or tradename listed.

Rockwell Disclaimer: The product is used surplus. MrPLC.com is not an authorized surplus dealer or affiliate for the Manufacturer of this product. The product may have older date codes or be an older series than that available direct from the factory or authorized dealers. Because MrPLC.com is not an authorized distributor of this product, the Original Manufacturer’s warranty does not apply. While many Allen-Bradley PLC products will have firmware already installed, MrPLC.com makes no representation as to whether a PLC product will or will not have firmware and, if it does have firmware, whether the firmware is the revision level that you need for your application. MrPLC.com also makes no representations as to your ability or right to download or otherwise obtain firmware for the product from Rockwell, its distributors, or any other source. MrPLC.com also makes no representations as to your right to install any such firmware on the product. MrPLC.com will not obtain or supply firmware on your behalf. It is your obligation to comply with the terms of any End-User License Agreement or similar document related to obtaining or installing firmware.

Like this post? Please share to your friends:
  • Два excel на одном компьютере
  • Два excel на одном компе
  • Два excel на один компьютер
  • Дашборды в excel скачать книгу
  • Дашборды excel примеры статистика