PDA

Просмотр полной версии : Получение данных с уровнемера



forpiv
05.09.2018, 02:36
Здравствуйте.
В наличии ПЛК 160 и уровнемер ЭХО-АС-01. С наскока вытянуть уровень не получилось, т.е плк к уровню подключил, что то вытянул, но не могу интерпретировать данные. Прилагаю файл с описанием протокола обмена данными. Подскажите в каком направлении рыть, как вытянуть уровень по модбас?

Новикова Маргарита
05.09.2018, 08:44
Здравствуйте.
В наличии ПЛК 160 и уровнемер ЭХО-АС-01. С наскока вытянуть уровень не получилось, т.е плк к уровню подключил, что то вытянул, но не могу интерпретировать данные. Прилагаю файл с описанием протокола обмена данными. Подскажите в каком направлении рыть, как вытянуть уровень по модбас?

Добрый день!
У Вас же в карте регистров самый первый параметр - это уровень в метрах (38623).
Вам нужно в конфигурации ПЛК добавить модуль Modbus master, затем Universal modbus device (это и есть Ваш уровнемер), затем добавить real input module (это и есть Ваш уровень).
С чем именно возникла проблема?

forpiv
05.09.2018, 09:17
Добрый день!
У Вас же в карте регистров самый первый параметр - это уровень в метрах (38623).
Вам нужно в конфигурации ПЛК добавить модуль Modbus master, затем Universal modbus device (это и есть Ваш уровнемер), затем добавить real input module (это и есть Ваш уровень).
С чем именно возникла проблема?

Маргарита, здравствуйте. Спасибо, что откликнулись.
Я не могу интерпретировать данные. Что то тянется а вот что непонятно. На уровне 11,38 м, а на скрине ерунда какая то. Я уже и по соседним адресам посмотрел, то же самое. Меня ставит в тупик пояснения после таблицы с регистрами модбас.

lara197a
05.09.2018, 09:47
Читайте раздел типы данных (Real)
В скрине все верно.

Новикова Маргарита
05.09.2018, 10:23
Маргарита, здравствуйте. Спасибо, что откликнулись.
Я не могу интерпретировать данные. Что то тянется а вот что непонятно. На уровне 11,38 м, а на скрине ерунда какая то. Я уже и по соседним адресам посмотрел, то же самое. Меня ставит в тупик пояснения после таблицы с регистрами модбас.

Попробуйте в настройках Universal modbus device в параметре byte_sequence установить native.

forpiv
06.09.2018, 01:45
Попробуйте в настройках Universal modbus device в параметре byte_sequence установить native.

Попробовал поставить native, результат тот же.

forpiv
06.09.2018, 02:06
Читайте раздел типы данных (Real)
В скрине все верно.
Уважаемая lara197a!
Спасибо, что уделили мне время и решили помочь. Как мог проштудировал раздел тип данных в РП к ПЛК и РП к кодесис. Прозрение не наступило. :( Может конкретно укажите в чем я ошибся?
За ранее благодарю, за более подробный ответ.

petera
06.09.2018, 05:29
Переменные Real занимают два регистра и имеют четные адреса. Это должно было стать понятным после штудирования
38632
в Вашем случае эти два регистра имеют адреса 0 и 1, соответственно переменная Н (float) имеет адрес 0, переменная Q (float) имеет адрес 2 переменная U (long) имеет адрес 4 и т.д.
По этому адрес регистра для Real input module должен быть не 1, а 0
38634
Это однозначно.
А вот если после такого исправления данные будут неверные измените параметр byte_sequence.

forpiv
06.09.2018, 06:36
Приветствую, уважаемый petera!
Адрес 0
byte_sequence = trace_mode - показания сильно скачут:
38635
38636
byte_sequence = native - показания стабильные:
38637
но снова же это не 11,33

petera
06.09.2018, 08:00
Приветствую, уважаемый petera!
Адрес 0
byte_sequence = trace_mode - показания сильно скачут:
38635
38636
byte_sequence = native - показания стабильные:
38637
но снова же это не 11,33
Блин, надо еще и порядок байт поменять
т.к. значение 11.33 "по ГОСТУ" равно 0x413547AE http://www.binaryconvert.com/result_float.html?decimal=049049046051051
а то, что пришло 7.219833E-7, "по ГОСТУ" соответствует 0x3541CE51 http://www.binaryconvert.com/result_float.html?decimal=055046050049057056051051 069045055

По старшему слову видно 4155 и 3541.
разница в младшем слове - не столь важна для анализа, т.к. это цифры после запятой и если их даже поменять, то получим
0x413551CE == 11.332471 http://www.binaryconvert.com/result_float.html?hexadecimal=413551CE

0x4135CE51 == 11.362870 http://www.binaryconvert.com/result_float.html?hexadecimal=4135CE51
Но переставить байты в словах можно только программным способом

petera
06.09.2018, 08:26
Перестановка байт

PROGRAM PLC_PRG
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
height: REAL;
height_2: REAL;
SWAP_BYTE_C: DWORD;
END_VAR

ptDw:=ADR(height_tmp);
(*В зависимости от параметра Byte Sequence в UMD нужно использовать
или этот вариант*)
SWAP_BYTE_C:=(ROL(ptDw^,8) AND 16#FF00FF00) OR (ROR(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE_C);
height:=ptFl^;

(*Или этот вариант*)
SWAP_BYTE_C:=(ROR(ptDw^,8) AND 16#FF00FF00) OR (ROL(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE_C);
height_2:=ptFl^;
Тут два варианта для разных значений Byte Sequence в UMD - height и height_2
height_tmp - это именованная переменная в слейве ПЛК
38638

Результат с Вашим значением
38639

Можно код оформить в виде функции

forpiv
06.09.2018, 11:57
Господа, спасибо всем, кто откликнулся на призыв о помощи.
Отдельное ОГРОМНОЕ СПАСИБО камраду petera!!!
Когда на первой странице прочитал, что нужно байты поменять местами, то малость завис. Надо искать что то подобное, может сам чего сочиню. А когда на второй странице увидел код, однозначно сам бы не осилил.

lara197a
06.09.2018, 12:46
извиняюсь, не часто захожу.
Тип данных реал записывается как в 1 байте мантисса со знаком, в остальных экспонента.
В модбасе не определен порядок следования байт.
Для этого иногда это требуется сделать в ручную.
Обычно сначала нужно представить число в бинарном виде и будет видно, какой байт содержит мантиссу.
Подробно все уже рассказал.
Для общего ознакомления можно почитать здесь:
https://studfiles.net/preview/3368734/

petera
06.09.2018, 14:31
В общем случае возможно четыре варианта расположения байт

4321 - "нормальный порядок" соответствующий представлению REAL в ПЛК
3421 - переставлены байты в словах
2143 - переставлены слова
1234 - переставлены слова и байты в словах

Код вынес в три функции

FUNCTION REAL_3412 : REAL
VAR_INPUT
in: REAL;
END_VAR
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
SWAP_BYTE: DWORD;
END_VAR
(*это вариант, когда порядок байт 3412*)
ptDw:=ADR(height_tmp);
SWAP_BYTE:=(ROL(ptDw^,8) AND 16#FF00FF00) OR (ROR(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE);
REAL_3412:=ptFl^;

FUNCTION REAL_2143 : REAL
VAR_INPUT
in: REAL;
END_VAR
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
SWAP_BYTE: DWORD;
END_VAR
(*это вариант, когда порядок байт 2143*)
ptDw:=ADR(height_tmp);
SWAP_BYTE:=ROR(ptDw^,16);
ptFl:=ADR(SWAP_BYTE);
REAL_2143:=ptFl^;

FUNCTION REAL_1234 : REAL
VAR_INPUT
in: REAL;
END_VAR
VAR
ptFl: POINTER TO REAL;
ptDw: POINTER TO DWORD;
SWAP_BYTE: DWORD;
END_VAR
(*это вариант, когда порядок байт 1234*)
ptDw:=ADR(height_tmp);
SWAP_BYTE:=(ROR(ptDw^,8) AND 16#FF00FF00) OR (ROL(ptDw^,8) AND 16#00FF00FF);
ptFl:=ADR(SWAP_BYTE);
REAL_1234:=ptFl^;

Пример использования в PLC_PRG

PROGRAM PLC_PRG
VAR
height_1: REAL; (*когда порядок 3412*)
height_2: REAL; (*когда порядок 1234*)
height_3: REAL; (*когда порядок 2134*)
END_VAR
(*height_tmp - это именованная переменная в слейве ПЛК
если нормальный порядок байт для внутреннего представления REAL
принять как 4321, то*)

(*этот вариант, когда порядок байт в height_tmp 3412*)
height_1:= REAL_3412(height_tmp);

(*этот вариант, когда порядок байт в height_tmp 1234*)
height_2:= REAL_1234(height_tmp);

(*этот вариант, когда порядок байт в height_tmp 2143*)
height_3:= REAL_2143(height_tmp);

38641