PDA

Просмотр полной версии : ПЛК200, OWEN Communcation, Взлёт ЭМ ЭКСПЕРТ-921МИ



Dan413
25.07.2025, 21:50
Здравсвуйте, пытаюсь опросить 2 расходомера Взлёт ЭМ ЭКСПЕРТ-921МИ, по протоколу MODBUS, через библиотеку Owen commutication, соединение есть, на выходе блока OCL.MB_Serial_Request на выходе xERROR мигает Illegal Data Adress, пытаюсь опросить два регистра в массив, но нули, понимаю что что то не так с адресами регистров но не могу понять что, пробовал уже по разному.
В карте регистров
349289 Текущий расход, л/мин Q
3 отбросил в начале, ввожу 49289.
с 3 вначале не компилируется ))
Заранее спасибо, за ответы )))

Dan413
25.07.2025, 21:54
Новичок в данной тематике, на другом ПЛК сделал сеть 3 ПЧ Instart и 2 конвеерных весов, всё опрашивается без проблем, по такой же логике вводил регистры ))

Dan413
25.07.2025, 22:04
Для ВЗЛЁТА ЭКСПЕРТ ЭМ есть разные карты регистров номер пробовал из разных карт, ошибка одна и та же

https://vzljot.ru/upload/iblock/2c2/wcwmq1mzfl7kkvwsw4g4ja3a1k8b2xdu/ModBus_em_expert.pdf

melky
25.07.2025, 22:14
3 в начале, 4 в команде - InputRegister
У вас там чё?

In_Da_Cher_A
25.07.2025, 22:17
сначала прочтите любым ОРС сервером или любой прогой для модбас
чтобы понять какой командой сколько и с каким порядком

Dan413
25.07.2025, 22:18
Получается 9289 надо просто ввести?

Dan413
25.07.2025, 22:43
У меня AC4 преобразователь MODBUS - USB, завтра им уже попробую.
В самой актуальной карте регистов
https://vzljot.ru/upload/iblock/fbd/3pzy2dgml07m4ty1v0ho243pzhkpgizo/modbus_em_expert9xxm.pdf
указан
349289 Текущий расход, л/мин Q

Dan413
25.07.2025, 22:46
Извините не совсем понял ваш вопрос.)

melky
25.07.2025, 23:20
Забавно, в протоколе 5 знаков на адрес с учётом определения типа регистра, а в документации 6 знаков.
Кто-то трындит.

Dan413
25.07.2025, 23:27
349289, я изначально и подумал, что 3 это функция, а 49289 это адресс. Но нет.

Емельянов Кирилл
26.07.2025, 01:23
+/- 1 к адресу делали?

МихаилГл
26.07.2025, 04:55
349289, я изначально и подумал, что 3 это функция, а 49289 это адресс. Но нет.

3 вначале, это область памяти, как я понимаю. В доке написано что область входных регистров, так почему вы читаете 3ей командой, для холдинг регистров, когда надо 4ой...

PS Вот это гляньте, там только области 5значные, а у вас 6значные...
https://masteropc.ru/faq_modbusuniversal

МихаилГл
26.07.2025, 05:08
Забавно, в протоколе 5 знаков на адрес с учётом определения типа регистра, а в документации 6 знаков.
Кто-то трындит.

Просто раньше не планировали так много данных отправлять, но так как 65536 это 5 значное число, то многие производители и пишут 400000, например у сименса на весах такая штука, забыв про первую цифру как информационную все встает на места.

imaex
26.07.2025, 06:07
349289, я изначально и подумал, что 3 это функция, а 49289 это адресс. Но нет.

Чего тут думать, если в документе явно сказано, что это регистры ввода. Лидирующая 3-ка - это просто мнемонический указатель на тип регистра, т.е. регистр ввода. Не функции, а регистра. Функция чтения будет 4. Так же в документе явно указано, что это логические адреса, т.е. физический будет на 1 меньше.

Dan413
26.07.2025, 19:00
Чего тут думать, если в документе явно сказано, что это регистры ввода. Лидирующая 3-ка - это просто мнемонический указатель на тип регистра, т.е. регистр ввода. Не функции, а регистра. Функция чтения будет 4. Так же в документе явно указано, что это логические адреса, т.е. физический будет на 1 меньше.

Попробовал, функцией READ INPUT REGISTR адресс ввёл 49288, 349289 убрал 3 отнял 1. Опрашиваю в массив, с масива ФБ OCL.WORD2_TO_REAL преобразую в число с плавающей запятой.
Данные приходят, но не то что нужно, фактически Q1 варьируется от 0 до 300, а Q2 стабильно в районе 50.
Либо регистр не тот, либо преобразовываю неправильно?

kondor3000
26.07.2025, 19:07
Попробовал, функцией READ INPUT REGISTR адресс ввёл 49288, 349289 убрал 3 отнял 1. Опрашиваю в массив, с масива ФБ OCL.WORD2_TO_REAL преобразую в число с плавающей запятой.
Данные приходят, но не то что нужно, фактически Q1 варьируется от 0 до 300, а Q2 стабильно в районе 50.
Либо регистр не тот, либо преобразовываю неправильно?

Для правильного отображения, надо правильно расставить регистры и байты.
Регистры можно поменять местами, байты переставляются нижним входом OCL.WORD2_TO_REAL

melky
26.07.2025, 19:07
Так а вы не отнимайте 1, введите как есть, или наоборот прибавьте 1.
И вообще, выпишите 4 байта принятых, и есть масса калькуляторов онлайн из hex, где вам покажут числа при разном расположении байт.

Dan413
26.07.2025, 21:04
Так тоже пробовал, FALSE на TRUE менял, тоже не те значения

Dan413
26.07.2025, 21:05
Не отнимая ввожу, та же ошибка что и вначале.
+1 49290 ввожу, равные два стабильные значения 9.95683

kondor3000
26.07.2025, 21:10
Так тоже пробовал, FALSE на TRUE менял, тоже не те значения

Варианта всего 4, а у вас только два.

МихаилГл
26.07.2025, 21:15
Вам бы для начала найти гарантированно тот регистр, значение которого вы знаете точно, так вы узнаете куда смещать или не смещать адрес. А потом уже на нужном регистре с вычисленным смещением проверять все перестановки...

melky
26.07.2025, 21:18
Если float, то там 8 вариантов, потому что можно зацепить не с того регистра :)

МихаилГл
26.07.2025, 21:21
Если float, то там 8 вариантов, потому что можно зацепить не с того регистра :)

Поэтому и предложим тс сначала потренироваться на регистре с заранее известным значением. А то потом окажется, что правильно показывает только до 100, например, а выше какаято чушь по литражу...)

Dan413
26.07.2025, 21:54
Попробовать через стандартным средтсвом опроса CODESYS опросить расходомер и с разной перестановкой , с разной перестановкой байт?

melky
26.07.2025, 22:44
Да компьютером с самого начала надо посмотреть и определиться. Потом подключать к ПЛК.

Валенок
26.07.2025, 23:57
потренироваться на регистре с заранее известным значением.
++!!
Задать адрес 99 и найти его. Сам бодрейт опять же.



Что же касается флоатов. Прочитать нужные 2 регистра как целое 32-битное и сделать простейшие операции

D1 at% MD0: dword;
X1 at% MD0: real; //1234

D2 at% MD2: dword;
X2 at% MD2: real; //3412

D3 at% MD4: dword;
X3 at% MD4: real; //2143

D4 at% MD6: dword;
X4 at% MD6: real; //4321

-------------------------
D1 := D3 := что прочитали
D2 := D4 := rol(D1, 16);
D3 := (shl(D3, 8) and 16#FF00FF00) + (shr(D3,8) and 16#00FF00FF);
D4 := (shl(D4, 8) and 16#FF00FF00) + (shr(D4,8) and 16#00FF00FF);
в иксах все варианты

In_Da_Cher_A
27.07.2025, 09:45
да всё это элементарно читается орс сервером или модбас пулом
спокойно всё делается
никаких проблем кроме нежелания прежде чем чтото делать выяснить что такое модбас и чем регистры ввода отличаются от регистров хранения
к ОВЕНу это не имеет никакого отношения

FPavel
27.07.2025, 14:22
Чтобы не привязываться к абсолютным адресам, делаю как в Pascal - через "объединения".
https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_datatype_union.html

Внимание - набирал без проверки в браузере, но смысл должен быть понятным
Сначала объявляю тип TConvert

TYPE TConvert:
UNION
by : ARRAY [0...3] OF BYTE;
w: ARRAY [0..1] OF WORD;
dw: DWORD;
r : REAL;
END_UNION
END_TYPE

А потом в программе объявляю переменную tcTemp и с помощью её полей обмениваю байты и слова

tcTemp.r := rReceived;

// перестановка 3412
wTemp := tcTemp.w[0];
tcTemp.w[0] := tcTemp.w[1];
tcTemp.w[1] := wTemp;

// или такая перестановка 4321 взамен предыдущей
byTemp := tcTemp.by[0];
tcTemp.by[0] := tcTemp.by[1];
tcTemp.by[1] := byTemp;
byTemp := tcTemp.by[2];
tcTemp.by[2] := tcTemp.by[3];
tcTemp.by[3] := byTemp;
wTemp := tcTemp.w[0];
tcTemp.w[0] := tcTemp.w[1];
tcTemp.w[1] := wTemp;

// присвоение результата в итоговую переменную rResult
rResult := tcTemp.r;
или любой другой вариант.
Обмен можно и при помощи ротации выполнять, а можно и как в примере - прямым обменом.

Тут плюс в отсутствии привязки к абсолютным адресам.

Dan413
29.07.2025, 20:09
Попробовал сегодня Modbus Scan просто найти устройства, нашёл, всё отлично.
Потом попробовал ModbusTool, прочитать регистр из карты регистров которую сам нашёл на сайте производителя, float, пробовал разную перестановку байт, единственное адекватный вариант float AB CD, но значение всё равно какое то левое.
Производитель написал, Вот ссылка на карту регистров для Эксперт https://vzljot.ru/upload/iblock/2c2/wcwmq1mzfl7kkvwsw4g4ja3a1k8b2xdu/ModBus_em_expert.pdf
Регистр текущего расхода 349187, л/мин, формат float. Считываете функцией 4 два регистра с адреса 49186.

Попробовал регистр который он дал, ошибка ILLEGAL DATA VALUE.

Dan413
29.07.2025, 20:27
Извините, коллеги. Ошибка вот в чём была, прибор у меня показывает в м3/час, а регистр читается в л/мин, умножил полученное значение на 0.06, получилось нужное значение ))