Просмотр полной версии : Получение данных с уровнемера
Здравствуйте.
В наличии ПЛК 160 и уровнемер ЭХО-АС-01. С наскока вытянуть уровень не получилось, т.е плк к уровню подключил, что то вытянул, но не могу интерпретировать данные. Прилагаю файл с описанием протокола обмена данными. Подскажите в каком направлении рыть, как вытянуть уровень по модбас?
Новикова Маргарита
05.09.2018, 08:44
Здравствуйте.
В наличии ПЛК 160 и уровнемер ЭХО-АС-01. С наскока вытянуть уровень не получилось, т.е плк к уровню подключил, что то вытянул, но не могу интерпретировать данные. Прилагаю файл с описанием протокола обмена данными. Подскажите в каком направлении рыть, как вытянуть уровень по модбас?
Добрый день!
У Вас же в карте регистров самый первый параметр - это уровень в метрах (38623).
Вам нужно в конфигурации ПЛК добавить модуль Modbus master, затем Universal modbus device (это и есть Ваш уровнемер), затем добавить real input module (это и есть Ваш уровень).
С чем именно возникла проблема?
Добрый день!
У Вас же в карте регистров самый первый параметр - это уровень в метрах (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.
Попробуйте в настройках Universal modbus device в параметре byte_sequence установить native.
Попробовал поставить native, результат тот же.
Читайте раздел типы данных (Real)
В скрине все верно.
Уважаемая lara197a!
Спасибо, что уделили мне время и решили помочь. Как мог проштудировал раздел тип данных в РП к ПЛК и РП к кодесис. Прозрение не наступило. :( Может конкретно укажите в чем я ошибся?
За ранее благодарю, за более подробный ответ.
Переменные Real занимают два регистра и имеют четные адреса. Это должно было стать понятным после штудирования
38632
в Вашем случае эти два регистра имеют адреса 0 и 1, соответственно переменная Н (float) имеет адрес 0, переменная Q (float) имеет адрес 2 переменная U (long) имеет адрес 4 и т.д.
По этому адрес регистра для Real input module должен быть не 1, а 0
38634
Это однозначно.
А вот если после такого исправления данные будут неверные измените параметр byte_sequence.
Приветствую, уважаемый petera!
Адрес 0
byte_sequence = trace_mode - показания сильно скачут:
38635
38636
byte_sequence = native - показания стабильные:
38637
но снова же это не 11,33
Приветствую, уважаемый 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
Но переставить байты в словах можно только программным способом
Перестановка байт
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
Можно код оформить в виде функции
Господа, спасибо всем, кто откликнулся на призыв о помощи.
Отдельное ОГРОМНОЕ СПАСИБО камраду petera!!!
Когда на первой странице прочитал, что нужно байты поменять местами, то малость завис. Надо искать что то подобное, может сам чего сочиню. А когда на второй странице увидел код, однозначно сам бы не осилил.
lara197a
06.09.2018, 12:46
извиняюсь, не часто захожу.
Тип данных реал записывается как в 1 байте мантисса со знаком, в остальных экспонента.
В модбасе не определен порядок следования байт.
Для этого иногда это требуется сделать в ручную.
Обычно сначала нужно представить число в бинарном виде и будет видно, какой байт содержит мантиссу.
Подробно все уже рассказал.
Для общего ознакомления можно почитать здесь:
https://studfiles.net/preview/3368734/
В общем случае возможно четыре варианта расположения байт
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
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot