Добрый день.
Каким образом можно осуществить преобразование двух WORD в DWORD и двух WORD в REAL?
С уважением.
Преобразование двух WORD в DWORD
Re: Преобразование двух WORD в DWORD
Что такое "два WORD"? Что это за самодельный тип данных? Сначала объясните, потом будем думать.
Re: Преобразование двух WORD в DWORD
Я тогда лучше задачу объясню: у меня есть modbus TCP server на 1024 слова (retain). Мне с одной программы (клиент ModBus TCP), которая написана на Delphi скидывают/забирают информацию из буфера. Там используются разнородные по типу значения, в том числе есть числа типа Real, которые представлены двумя словами у меня в буфере, как бы так взять из этих двух отдельных слов сделать DWORD, а затем из DWROD -> REAL(это уже делается в CONV). Была еще идея сделать не массив из 1024 слов (retain), а структуру из разднородных типов массивов, только правильно ли modbus tcp server адресовать (последовательно) такую структуру массивов будет при обмене.
Re: Преобразование двух WORD в DWORD
TIA Portal S7-1200?
Re: Преобразование двух WORD в DWORD
да... TIA Portal V13 SP1.
Re: Преобразование двух WORD в DWORD
Ну тогда обрати внимание на функции Serialize/Deserialize.
Смысл:
1. Функция Serialize применяется при приёме однотипных данных (байт или слов). Эти данные оборачиваются в структуру.
2. Функция Deserialize применяется при отправке данных. Данные разного типа (структура) преобразуются в набор неструктурированных байт или слов.
Моё сообщение с asutpforum:
Смысл:
1. Функция Serialize применяется при приёме однотипных данных (байт или слов). Эти данные оборачиваются в структуру.
2. Функция Deserialize применяется при отправке данных. Данные разного типа (структура) преобразуются в набор неструктурированных байт или слов.
Моё сообщение с asutpforum:
Зацените функции переноса данных Serialize/Deserialize, которые работают со структурами (Struct). Допустим есть тэг Petya типа Word, который пришел с панели. Нужно переместить биты из этого тэга в структуру Vasya, где каждый бит имеет свое имя. Функция Serialize выполняет этой действие.
Функция Deserialize выполняет обратное действие. 1. Можно к Petya добавить тэг Kolya типа Word, а в структуру Vasya добавить еще 16 бит. И эти функции будут перебрасывать сразу 32 бита, наращивать структуру можно сколь угодно.
2. Структура может содержать не только биты, но и другие типы, если это имеет смысл.
P.S. Вообще я ударно использовал эти функции, чтобы принять большое количество байт из шины CAN и затем разместить данные в структуры с удобным собственным именем и типом данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Преобразование двух WORD в DWORD
Михайло, спасибо.
Я понял, надо обдумать, уже завтра.
А если так, система правильно скушает такую комбинацию: создаём структуру данных. В этой структуре прописываем к примеру пять массивов - 2 массива word, 2 массива DWORD, 1 массив типа Real. Инструкции MB_SERVER скормить ссылку на структуру в MB_HOLD_REG. Вопрос: адресация массивов будет пословная с точки зрения Modbus TCP client, а я буду забирать в том типе данных в котором мне нужно - например 1 массив 10 слов, 2 массив - 10 слов, 3 массив - 10 dword слов, 4 массив - 10 dword слов, 5 массив - 10 real, значит первое значение real будет со смещением 10+10+20+20 слов? Или не прав?
Я понял, надо обдумать, уже завтра.
А если так, система правильно скушает такую комбинацию: создаём структуру данных. В этой структуре прописываем к примеру пять массивов - 2 массива word, 2 массива DWORD, 1 массив типа Real. Инструкции MB_SERVER скормить ссылку на структуру в MB_HOLD_REG. Вопрос: адресация массивов будет пословная с точки зрения Modbus TCP client, а я буду забирать в том типе данных в котором мне нужно - например 1 массив 10 слов, 2 массив - 10 слов, 3 массив - 10 dword слов, 4 массив - 10 dword слов, 5 массив - 10 real, значит первое значение real будет со смещением 10+10+20+20 слов? Или не прав?
Re: Преобразование двух WORD в DWORD
Не вникал, как-то так.
Re: Преобразование двух WORD в DWORD
Добрый день.
Михайло, попробую сейчас со структурой, отпишусь, что получилось.
Михайло, попробую сейчас со структурой, отпишусь, что получилось.
Re: Преобразование двух WORD в DWORD
Мои исследования, если кому интересно будет:
- структура из разнородных массивов, т.е. структура в которую входит массив из 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. если честно, извиняюсь и понимаю что на форуме это не принято, но "заипа..и эти самописные скады", потом занимаешься каким-то...
- структура из разнородных массивов, т.е. структура в которую входит массив из 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. если честно, извиняюсь и понимаю что на форуме это не принято, но "заипа..и эти самописные скады", потом занимаешься каким-то...
-
- Любитель
- Сообщения: 36
- Зарегистрирован: 06 дек 2017, 11:18
Re: Преобразование двух WORD в DWORD
Чтобы просто переставить два слова не обязательно обращаться к вычислениям.
Достаточно в памяти наложить друг на друга Двойное слово и два обычных: А потом записывать в обычные, а читать из двойного и наоборот. Надо только помнить, в каком порядке Siemens хранит байты и слова в памяти.
Достаточно в памяти наложить друг на друга Двойное слово и два обычных: А потом записывать в обычные, а читать из двойного и наоборот. Надо только помнить, в каком порядке Siemens хранит байты и слова в памяти.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Любитель
- Сообщения: 36
- Зарегистрирован: 06 дек 2017, 11:18
Re: Преобразование двух WORD в DWORD
Еще есть команда AT, которая позволяет накладывать друг на друга любые структуры и массивы. Но только в функциях.
Особенность!: в свойствах функционального блока нужно указать, что он не оптимизированный (убрать галочку): А команду AT вводить в поле "Data type" и нажать ВВОД. Она сама переместится в поле "Name" и к ней добавится название структуры, которая введена выше.
Потом снова в "Data type" ввести "Array" и т.д.
Делаем пользовательскую структуру: В функциональном блоке накладываем эту структуру на массив слов:Борисыч писал(а): мне нужно - например 1 массив 10 слов, 2 массив - 10 слов, 3 массив - 10 dword слов, 4 массив - 10 dword слов, 5 массив - 10 real
Первая половина первого значения real: AReal5[1] будет в Words[61], вторая в Words[62].Борисыч писал(а): значит первое значение real будет со смещением 10+10+20+20 слов? Или не прав?
Особенность!: в свойствах функционального блока нужно указать, что он не оптимизированный (убрать галочку): А команду AT вводить в поле "Data type" и нажать ВВОД. Она сама переместится в поле "Name" и к ней добавится название структуры, которая введена выше.
Потом снова в "Data type" ввести "Array" и т.д.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Преобразование двух WORD в DWORD
Взаимопересекающиеся структуры? Обязательно использовать UDT?
-
- Любитель
- Сообщения: 36
- Зарегистрирован: 06 дек 2017, 11:18
Re: Преобразование двух WORD в DWORD
Можно на нее же наложить еще массив байтов, и тогда первое real будет доступно побайтно в байтах с Bytes[121] по Bytes[124]. Перестановка значений в этих байтах изменит значение в AReal5[1]. А именно такая задача часто встречается в MODBUS vs Siemens.
Можно вообще наложить одну произвольную структуру на другую.У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Любитель
- Сообщения: 36
- Зарегистрирован: 06 дек 2017, 11:18
Re: Преобразование двух WORD в DWORD
Можно структуру создать и локально: Но обычно со структурой работаешь в разных местах, и лучше сделать UDT.Михайло писал(а):Взаимопересекающиеся структуры? Обязательно использовать UDT?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Любитель
- Сообщения: 36
- Зарегистрирован: 06 дек 2017, 11:18
Re: Преобразование двух WORD в DWORD
Забыл сказать одну вещь - вторая структура не должна быть больше первой. Меньше может быть.
-
- Любитель
- Сообщения: 36
- Зарегистрирован: 06 дек 2017, 11:18
Re: Преобразование двух WORD в DWORD
У Сименса много всяких способов косьвенной адресации. Запутаться, как два байта переслать.
Но еще один простой способ хочу привести: Во многих типах данных можно обратиться прямо ко внутреннему слову, байту или биту через добавление к тэгу .%W, .%B или .%X
Третья строка в скриншоте для вычислений не нужна, она нужна чтобы проверить, правильно ли изменилось значение. После проверки его можно убрать.
Но еще один простой способ хочу привести: Во многих типах данных можно обратиться прямо ко внутреннему слову, байту или биту через добавление к тэгу .%W, .%B или .%X
Третья строка в скриншоте для вычислений не нужна, она нужна чтобы проверить, правильно ли изменилось значение. После проверки его можно убрать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Преобразование двух WORD в DWORD
Виктор спасибо. Интересно.)