PDA

Просмотр полной версии : МВ110-224.8А порядок следования байт



Васильев
24.07.2023, 23:46
Подскажите пожалуйста порядок следования байт для МВ110-224.8А.
(прибора пока нет, на руках проверить нет возможности)

Собираем шкаф из 20 МВ110-224.8А и для ускорения опроса хотим сделать опрос каждого
считыванием группы регистров методом string (на форуме есть несколько примеров, но информация не однозначная). Для разбора нужен порядок следования байт.

1. при считывании регистра 0001 (целое значение измерения входа 1) порядок байт будет старший байт, младший байт (как в протоколе Modbus RTU) или наоборот?

2. с плавающей точкой по адресу 0004 - будет старшее слово Float32, а по адресу 0005 будет младшее или наоборот?

3. будут подключены датчики PT1000 (МВ110-224.8А будет сконфигурировано) в этом случае при считывании будет показание температуры или сопротивление ТС.

Спасибо большее.

imaex
25.07.2023, 07:42
Для float 3 2 1 0 (старшим словом вперёд). Для целочисленных ничего специально задавать не нужно (и не можно).

kondor3000
25.07.2023, 08:28
Подскажите пожалуйста порядок следования байт для МВ110-224.8А.
(прибора пока нет, на руках проверить нет возможности)

Собираем шкаф из 20 МВ110-224.8А и для ускорения опроса хотим сделать опрос каждого
считыванием группы регистров методом string (на форуме есть несколько примеров, но информация не однозначная). Для разбора нужен порядок следования байт.
Спасибо большее.

Вот готовый пример считывания всех параметров с МВ110-8А, через String https://owen.ru/forum/showthread.php?t=35094#10
Целочисленные будут как есть, в переменных Float, переставлены регистры, в программе уже есть их перестановка.
Если входы блока сконфигурированы, будет выдаваться температура.
При адаптации для вашего ПЛК , достаточно добавить в конфигурации 2 String, с настройками как в примере и ваш адрес модуля.

Васильев
25.07.2023, 09:10
Спасибо большое. Я читал ваши посты.
установил таргет файл, ваш проект открылся.
при приёме у вас не не меняется порядок байт (trace mode)

значит МВА отправляет сначала младший байт, потом старший байт для переменной word?

судя по вашему коду
w1:=w_1^[1]; w2:=w_1^[7]; ..... (* Целочисленное значение без смещения INT *)

а для Float32
TWO_WORD_TO_REAL(wIn1:=w_1^[5] , wIn2:=w_1^[4] , rOut=>r1 );
сначала старшее слово w_1^[4], потом младшее w_1^[5]?

так?

kondor3000
25.07.2023, 09:59
Спасибо большое. Я читал ваши посты.
установил таргет файл, ваш проект открылся.
п
а для Float32
TWO_WORD_TO_REAL(wIn1:=w_1^[5] , wIn2:=w_1^[4] , rOut=>r1 );
сначала старшее слово w_1^[4], потом младшее w_1^[5]?

так?
Это не совсем так, при передаче через String, порядок не меняется, как регистры лежат в модуле, так и считываются. Поэтому приходится их переставлять для Float32.
Но вообще да, получается Float лежат старшим регистром вперёд.
Если читать через конфигурацию, то настройку ставите Native и ПЛК сам переставляет регистры ( если надо).
Например при связи ПЛК с панелью СП310, через String, ничего переставлять не надо, Float отображается правильно.

Васильев
25.07.2023, 10:41
совсем запутался..
вот читаю данные в стринг без перестановки в модуле модбас с 0 регистра по 5
посылка в буфере Buf будет такой ?

Buf[1] = R0 старший байт,
Buf[2] = R0 младший байт,
Buf[3] = R1 старший байт,
Buf[4] = R1 младший байт,
Buf[5] = R2 младший байт,
Buf[6] = R2 младший байт,
Buf[7] = R3 старший байт,
Buf[8] = R3 младший байт,

Buf[9] = R4 старший байт, - старшее слово для Float32
Buf[10] = R4 младший байт,
Buf[11] = R5 старший байт, - младшее слово для Float32
Buf[12] = R5 младший байт,

kondor3000
25.07.2023, 10:54
совсем запутался..
вот читаю данные в стринг без перестановки в модуле модбас с 0 регистра по 5
посылка в буфере Buf будет такой ?
,
По моей ссылке, откройте 1 сообщение, там Cs-Cs всё расписал про байты, порядок байт в целочисленных и Float

Васильев
25.07.2023, 12:27
сообщения Cs-Cs прочитал
Cs-Cs всё расписал про байты, порядок байт в целочисленных и Float (спасибо большое), но опять такие Cs-Cs в своём коде пишет что младший байт идёт первым, а в техподдержке сегодня сказали что МВ110-8а передаёт данные старшим байтом вперёд...

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

Cs-Cs
25.07.2023, 13:07
....я расписал в том примере, которым ПЛК читаю через STRING.
А ещё модули же обновились В моей инструкции от 2019 года написано что старшее слово передаётся в регистре с меньшим номером (старшим вперёд) как в ТехПоддержке и сказали.

...и вообще. Мать его! Раз речь идёт про STRING - значит это CodeSys 2.3.
А значит можно взять мой ГОТОВЫЙ FB из моего примера - и прям накопировать всё на много модулей!

Васильев
25.07.2023, 13:18
может конечно не там читаю и уже туплю, но судя по коду в строке младший байт идёт первым
CSParseMV8A.ValDigPoint := ((BYTE_TO_WORD(pBuffer[1]) OR SHL(BYTE_TO_WORD(pBuffer[2]), 8)));

вы так и пишете..
Младший байт (pBuffer[1]) идёт здесь первым, поэтому я его просто склеиваю через OR Старший байт идёт здесь вторым, поэтому его надо сдвинуть влево на 8 бит (из 16#0012 превратить в 16#1200) при помощи оператора SHR и снова склеить с нужным нам числом.


скиньте пожалуйста ссылку на ваш FB

Cs-Cs
25.07.2023, 15:26
скиньте пожалуйста ссылку на ваш FB Я ненавижу невежественность и невнимательность.
Мои FB и готовый пример лежит в первой странице моей темы, на которую ссылался kondor3000, причём уже даже советовал открыть первую страницу моей темы, цитирую
По моей ссылке, откройте 1 сообщение, там Cs-Cs всё расписал про байты, порядок байт в целочисленных и Float

kondor3000
25.07.2023, 15:53
сообщения Cs-Cs прочитал
Cs-Cs всё расписал про байты, порядок байт в целочисленных и Float (спасибо большое), но опять такие Cs-Cs в своём коде пишет что младший байт идёт первым, а в техподдержке сегодня сказали что МВ110-8а передаёт данные старшим байтом вперёд...

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

Так всем брейк, не надо нервничать)))
Распишу по порядку
1) Вы пропустили ( вероятно), что в передаче через STRING порядок не меняется.
2) Техподдержка, вероятно ответила про обычную конфигурацию, где меняется порядок регистров и байт по Модбас.

Вот и вся проблема, выложенные проекты проверены, можете повторить и проверить сами. Мой проет проверяли уже раз сто, никто проблем не нашёл)))

Васильев
25.07.2023, 16:57
Благодарю.

Cs-Cs
25.07.2023, 17:31
Меня БЕСЯТ невежды. У меня в той теме лежит готовый пример, рабочий.
Нет, надо всем повыносить мозги, (мне ещё и в личку понаписать), наговорить на две страницы темы - и про пример забыть.

Валенок
25.07.2023, 17:42
..в передаче через STRING порядок не меняется.)
Увы )) Меняется. От сетевого к машинному.
Не меняется через modbus.lib в buffer

Васильев
30.07.2023, 13:24
Прошу помощи. все устройства пришли
1. на столе собрал связку плк110-30 (мастер) + 4 МВ110-8А (слайв).
2. МВ110-8А настроены через конфигуратор (адреса заданы, типы датчиков определены, параметры modbus заданы)
3. создаю тестовый проект ПЛК110-30
https://disk.yandex.ru/i/3WCEZavcfY-UEA
4. тестовая программа получает доступ к элементам стринг, отображает последний адрес устройства modbus и ошибку
5. нет никакой активности по modbus

подскажите пожалуйста, что упустил?

kondor3000
30.07.2023, 13:51
Прошу помощи. все устройства пришли
1. на столе собрал связку плк110-30 (мастер) + 4 МВ110-8А (слайв).
2. МВ110-8А настроены через конфигуратор (адреса заданы, типы датчиков определены, параметры modbus заданы)
3. создаю тестовый проект ПЛК110-30
https://disk.yandex.ru/i/3WCEZavcfY-UEA
4. тестовая программа получает доступ к элементам стринг, отображает последний адрес устройства modbus и ошибку
5. нет никакой активности по modbus

подскажите пожалуйста, что упустил?

Вот ваша программа, где у вас 4 модуля? Что у вас за байты в основной программе и что вы сделали в ФБ Opros_MVA ? а=в это что такое? 69290
А вот что должно быть

w_1:=ADR(Str14); (*Начальный адрес в массиве WORD *)
w_2:=ADR(Str58);

Васильев
30.07.2023, 14:17
это просто тест, и переменные просто для ознакомления с codesys ни какого смысла в них нет
меня интересует почему нет обмена по модбус, должно быть периодическое считывание со slave устройства и
в переменой LastAdress должен быть адрес последнего опрощенного устройства и ошибка если устройства нет.
у меня в них значение всегда 0.

сейчас создал проект с нуля по чтению одного регистра по инструкции
https://cs-cs.net/plk-oven-110-programmiruem-na-codesys

всё работает, обмен начался..

Благодарю всех.

kondor3000
30.07.2023, 15:13
это просто тест, и переменные просто для ознакомления с codesys ни какого смысла в них нет
меня интересует почему нет обмена по модбус, должно быть периодическое считывание со slave устройства и
в переменой LastAdress должен быть адрес последнего опрощенного устройства и ошибка если устройства нет.
у меня в них значение всегда 0.

Так возьмите пример, и ничего не переделывая проверьте, поменяйте конфигурацию под свой ПЛК и поставьте адрес своего МВ8А

Вот повыкидывал, всё что не работало, проверьте адрес МВ8А ( в программе 31) подключите 1 блок к RS-485-2 и проверьте, все переменные будут в глобальных

Зачем скорость поставили 9600, у вас ведь 4 блока, и поллинг 300 ms ? Вот зачем это ?

Васильев
30.07.2023, 19:47
и так информация для начинающих (как и я)

в МВ110-08А порядок следования байт при считывании регистров сначала младший, потом старший байт;
для значения температуры в формате Float32 в регистре 4 передаётся порядок и старшая часть мантиссы (сначала младший байт, потом старший)
в регистре 5 передаётся младшая часть мантиссы (сначала младший байт, потом старший)

в стандартном представлении чисел Float32 в памяти мк сначала идёт младшая часть мантиссы, потом порядок и старшая часть,
поэтому при получении данных с МВ110-8а необходимо слова переставить местами.

считываем данные для 4 датчиков через строковую переменную,
копируем в массив temp данные для одного датчика, через указатель типа word,
температуру в формате Float32 получаем путём копирования, через указатель типа word:

ptr:=ADR(var_real);
ptr^[0]:=temp[5];
ptr^[1]:=temp[4];

параметр Byte Sequence (trace_mode и native) при конфигурировании ModBus влияет только на порядок байт в слове при считывании Real input module (сам проверил и находил в каком-то мануле).

Спасибо большое.