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

ПЛК / Децентрализованная периферия
Ответить
Борисыч
Любитель
Сообщения: 41
Зарегистрирован: 20 дек 2017, 17:01

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

Сообщение Борисыч »

Добрый день.
Каким образом можно осуществить преобразование двух WORD в DWORD и двух WORD в REAL?

С уважением.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

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

Сообщение Михайло »

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

Борисыч
Любитель
Сообщения: 41
Зарегистрирован: 20 дек 2017, 17:01

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

Сообщение Борисыч »

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

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

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

Сообщение Михайло »

TIA Portal S7-1200?

Борисыч
Любитель
Сообщения: 41
Зарегистрирован: 20 дек 2017, 17:01

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

Сообщение Борисыч »

да... TIA Portal V13 SP1.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

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

Сообщение Михайло »

Ну тогда обрати внимание на функции 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 и затем разместить данные в структуры с удобным собственным именем и типом данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Борисыч
Любитель
Сообщения: 41
Зарегистрирован: 20 дек 2017, 17:01

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 слов? Или не прав?

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

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

Сообщение Михайло »

Не вникал, как-то так. :)

Борисыч
Любитель
Сообщения: 41
Зарегистрирован: 20 дек 2017, 17:01

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

Сообщение Борисыч »

Добрый день.
Михайло, попробую сейчас со структурой, отпишусь, что получилось.

Борисыч
Любитель
Сообщения: 41
Зарегистрирован: 20 дек 2017, 17:01

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

Бардичев Виктор
Любитель
Сообщения: 36
Зарегистрирован: 06 дек 2017, 11:18

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

Сообщение Бардичев Виктор »

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

Бардичев Виктор
Любитель
Сообщения: 36
Зарегистрирован: 06 дек 2017, 11:18

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

Сообщение Бардичев Виктор »

Еще есть команда 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" и т.д.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

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

Сообщение Михайло »

Взаимопересекающиеся структуры? Обязательно использовать UDT?

Бардичев Виктор
Любитель
Сообщения: 36
Зарегистрирован: 06 дек 2017, 11:18

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

Сообщение Бардичев Виктор »

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

Бардичев Виктор
Любитель
Сообщения: 36
Зарегистрирован: 06 дек 2017, 11:18

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

Сообщение Бардичев Виктор »

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

Бардичев Виктор
Любитель
Сообщения: 36
Зарегистрирован: 06 дек 2017, 11:18

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

Сообщение Бардичев Виктор »

Забыл сказать одну вещь - вторая структура не должна быть больше первой. Меньше может быть.

Бардичев Виктор
Любитель
Сообщения: 36
Зарегистрирован: 06 дек 2017, 11:18

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

Сообщение Бардичев Виктор »

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

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

Борисыч
Любитель
Сообщения: 41
Зарегистрирован: 20 дек 2017, 17:01

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

Сообщение Борисыч »

Виктор спасибо. Интересно.)

Ответить