Страница 1 из 1

Преобразование двух WORD в DWORD

Добавлено: 22 янв 2018, 13:06
Борисыч
Добрый день.
Каким образом можно осуществить преобразование двух WORD в DWORD и двух WORD в REAL?

С уважением.

Re: Преобразование двух WORD в DWORD

Добавлено: 22 янв 2018, 15:30
Михайло
Что такое "два WORD"? Что это за самодельный тип данных? Сначала объясните, потом будем думать. :)

Re: Преобразование двух WORD в DWORD

Добавлено: 22 янв 2018, 17:01
Борисыч
Я тогда лучше задачу объясню: у меня есть modbus TCP server на 1024 слова (retain). Мне с одной программы (клиент ModBus TCP), которая написана на Delphi скидывают/забирают информацию из буфера. Там используются разнородные по типу значения, в том числе есть числа типа Real, которые представлены двумя словами у меня в буфере, как бы так взять из этих двух отдельных слов сделать DWORD, а затем из DWROD -> REAL(это уже делается в CONV). Была еще идея сделать не массив из 1024 слов (retain), а структуру из разднородных типов массивов, только правильно ли modbus tcp server адресовать (последовательно) такую структуру массивов будет при обмене. :)

Re: Преобразование двух WORD в DWORD

Добавлено: 22 янв 2018, 17:09
Михайло
TIA Portal S7-1200?

Re: Преобразование двух WORD в DWORD

Добавлено: 22 янв 2018, 17:13
Борисыч
да... TIA Portal V13 SP1.

Re: Преобразование двух WORD в DWORD

Добавлено: 22 янв 2018, 17:20
Михайло
Ну тогда обрати внимание на функции Serialize/Deserialize.

Смысл:
1. Функция Serialize применяется при приёме однотипных данных (байт или слов). Эти данные оборачиваются в структуру.
2. Функция Deserialize применяется при отправке данных. Данные разного типа (структура) преобразуются в набор неструктурированных байт или слов.

Моё сообщение с asutpforum:
Зацените функции переноса данных Serialize/Deserialize, которые работают со структурами (Struct). Допустим есть тэг Petya типа Word, который пришел с панели. Нужно переместить биты из этого тэга в структуру Vasya, где каждый бит имеет свое имя. Функция Serialize выполняет этой действие.
Функция Deserialize выполняет обратное действие.
Serialize-Deserialize.png
1. Можно к Petya добавить тэг Kolya типа Word, а в структуру Vasya добавить еще 16 бит. И эти функции будут перебрасывать сразу 32 бита, наращивать структуру можно сколь угодно.
2. Структура может содержать не только биты, но и другие типы, если это имеет смысл.

P.S. Вообще я ударно использовал эти функции, чтобы принять большое количество байт из шины CAN и затем разместить данные в структуры с удобным собственным именем и типом данных.

Re: Преобразование двух WORD в DWORD

Добавлено: 22 янв 2018, 17:37
Борисыч
Михайло, спасибо.
Я понял, надо обдумать, уже завтра.
А если так, система правильно скушает такую комбинацию: создаём структуру данных. В этой структуре прописываем к примеру пять массивов - 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

Добавлено: 22 янв 2018, 19:09
Михайло
Не вникал, как-то так. :)

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 07:07
Борисыч
Добрый день.
Михайло, попробую сейчас со структурой, отпишусь, что получилось.

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 10:36
Борисыч
Мои исследования, если кому интересно будет:
- структура из разнородных массивов, т.е. структура в которую входит массив из 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. если честно, извиняюсь и понимаю что на форуме это не принято, но "заипа..и эти самописные скады", потом занимаешься каким-то... :)

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 19:43
Бардичев Виктор
Чтобы просто переставить два слова не обязательно обращаться к вычислениям.
Достаточно в памяти наложить друг на друга Двойное слово и два обычных:
PLC tags.PNG
А потом записывать в обычные, а читать из двойного и наоборот.
Convert.PNG
Надо только помнить, в каком порядке Siemens хранит байты и слова в памяти.

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 20:33
Бардичев Виктор
Еще есть команда AT, которая позволяет накладывать друг на друга любые структуры и массивы. Но только в функциях.
Борисыч писал(а): мне нужно - например 1 массив 10 слов, 2 массив - 10 слов, 3 массив - 10 dword слов, 4 массив - 10 dword слов, 5 массив - 10 real
Делаем пользовательскую структуру:
UDT.PNG
В функциональном блоке накладываем эту структуру на массив слов:
AT.PNG
Борисыч писал(а): значит первое значение real будет со смещением 10+10+20+20 слов? Или не прав?
Первая половина первого значения real: AReal5[1] будет в Words[61], вторая в Words[62].

Особенность!: в свойствах функционального блока нужно указать, что он не оптимизированный (убрать галочку):
NotOptimise.PNG
А команду AT вводить в поле "Data type" и нажать ВВОД. Она сама переместится в поле "Name" и к ней добавится название структуры, которая введена выше.
Потом снова в "Data type" ввести "Array" и т.д.

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 20:37
Михайло
Взаимопересекающиеся структуры? Обязательно использовать UDT?

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 20:54
Бардичев Виктор
Можно на нее же наложить еще массив байтов, и тогда первое real будет доступно побайтно в байтах с Bytes[121] по Bytes[124]. Перестановка значений в этих байтах изменит значение в AReal5[1]. А именно такая задача часто встречается в MODBUS vs Siemens.
Second.PNG
Можно вообще наложить одну произвольную структуру на другую.

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 21:02
Бардичев Виктор
Михайло писал(а):Взаимопересекающиеся структуры? Обязательно использовать UDT?
Можно структуру создать и локально:
Local.PNG
Но обычно со структурой работаешь в разных местах, и лучше сделать UDT.

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 21:22
Бардичев Виктор
Забыл сказать одну вещь - вторая структура не должна быть больше первой. Меньше может быть.

Re: Преобразование двух WORD в DWORD

Добавлено: 23 янв 2018, 21:49
Бардичев Виктор
У Сименса много всяких способов косьвенной адресации. Запутаться, как два байта переслать.
Но еще один простой способ хочу привести:
Напоследок.PNG
Во многих типах данных можно обратиться прямо ко внутреннему слову, байту или биту через добавление к тэгу .%W, .%B или .%X

Третья строка в скриншоте для вычислений не нужна, она нужна чтобы проверить, правильно ли изменилось значение. После проверки его можно убрать.

Re: Преобразование двух WORD в DWORD

Добавлено: 24 янв 2018, 12:48
Борисыч
Виктор спасибо. Интересно.)