PDA

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



Сема
26.04.2018, 23:32
Добрый вечер, уважаемые коллеги.

Ну помогите мне пожалуйста, я не могу разобраться с одной вещью. Я пытаюсь подружить СПК207.03.WEB с электросчётчиком Меркурий 234 ART-03 P.

Открыть ком порт и опросить Меркурий через Mercury.lib вроде удалось, но я совсем не понимаю, что мне надо сделать с данными с выхода блока data_buffer. Я понимаю, что байты нужно склеить в определённом порядке. Но я не понимаю в каком. Я прилагаю все скриншоты, в том числе и на инструкцию по протоколу Меркурия. У меня не получилось сделать так, чтобы он вывел мне в real значение напряжения в 1 фазе.

Про описание запроса и ответа напряжения в инструкции начинается со страницы 53. Очень нужна ваша помощь, спасибо!

Scream
27.04.2018, 07:51
Там переменная должна получиться из 4х байт не REAL, а dword, её потом просто поделить на 100 надо.
Просто 4 байта надо положить в dword, можно со сдвигом поиграться, можно умножать на 256.

у меня ток на 1 фазе, но к вольтам порядок байт наверное такой же, и я беру с массива полного ответа, поэтому не с 0.
DWORD = SHL(BYTE_TO_DWORD(rx_buffer[2]),24) + SHL(BYTE_TO_DWORD(rx_buffer[1]),16) + SHL(BYTE_TO_DWORD(rx_buffer[4]),8) + BYTE_TO_DWORD(rx_buffer[3]);

Сема
27.04.2018, 09:39
Там переменная должна получиться из 4х байт не REAL, а dword, её потом просто поделить на 100 надо.
Просто 4 байта надо положить в dword, можно со сдвигом поиграться, можно умножать на 256.

у меня ток на 1 фазе, но к вольтам порядок байт наверное такой же, и я беру с массива полного ответа, поэтому не с 0.
DWORD = SHL(BYTE_TO_DWORD(rx_buffer[2]),24) + SHL(BYTE_TO_DWORD(rx_buffer[1]),16) + SHL(BYTE_TO_DWORD(rx_buffer[4]),8) + BYTE_TO_DWORD(rx_buffer[3]);

То есть, у меня всё остальное правильно, система сама у меня работает, а сдвигать зачем??

Scream
27.04.2018, 10:44
а сдвигать зачем??

Какие есть варианты положить 4 отдельных байта в одно двойное слово?

Сема
27.04.2018, 10:58
А почему четыре байта, если в документации указано три? Не могу сообразить..

Трофимов Артем
27.04.2018, 11:08
возьмите dword переменную. положите со двигом три принятых байта (как Вам показал тов. Scream ) четверый байт у Вас будет пустым == 0 , далее число преобразуете в real и делите на 100

Scream
27.04.2018, 11:13
А почему четыре байта, если в документации указано три? Не могу сообразить..

Потому что у меня было 4 ;)
я показал 99% решения, осталось подумать на 1% и подставить свои данные.

Сема
27.04.2018, 11:18
Потому что у меня было 4 ;)
я показал 99% решения, осталось подумать на 1% и подставить свои данные.

А, я понял, я думал, что это важно. спасибо..

Сема
27.04.2018, 20:13
Чё-то у меня не получилось, как мне надо расположить байты, чтобы получить 220 В. В каком порядке? Я пробовал во всех комбинациях.

melky
27.04.2018, 22:51
В документации же написано как переставить байты (три байта, так как в четвертом байте информация направления, которая вам не нужна для напряжения).
младшим байтом вперед)

Сема
28.04.2018, 09:00
Я во всех вариациях пробовал, получается всё что угодно, но только не 224600 допустим. А в буфере младшим байтом считается с 0 ячейки массива? А в этом выражении (DWORD = SHL(BYTE_TO_DWORD(rx_buffer[2]),24) + SHL(BYTE_TO_DWORD(rx_buffer[1]),16) + SHL(BYTE_TO_DWORD(rx_buffer[4]),8) + BYTE_TO_DWORD(rx_buffer[3]) где младший байт?

Трофимов Артем
28.04.2018, 10:29
данные всегда приходят одни и те же? читаетете именно напряжение фазы?
p.s. попробуйте поменять тип запроса в параметре data c 22 на 16#11

melky
28.04.2018, 13:09
Сема не помню сейчас по документации на счетчик, есть у них там фишечка, они лепят в одном бите направление реактивной составляющей где надо и где не надо.
Надо на это бит наложить маску для обнуления. (вот не помню впихивали они это в напряжение или нет, посмотрите внимательнее документацию) и если у вас направление реактивной составляющей обратное, то вы никогда не увидите там 220 вольт на фазе из-за этого бита.

Вечером будет время попробую глянуть свой код. Но я точно читал функцией сразу напряжения всех трех фаз для уменьшения количества запросов.

Сема
28.04.2018, 13:28
Сема не помню сейчас по документации на счетчик, есть у них там фишечка, они лепят в одном бите направление реактивной составляющей где надо и где не надо.
Надо на это бит наложить маску для обнуления. (вот не помню впихивали они это в напряжение или нет, посмотрите внимательнее документацию) и если у вас направление реактивной составляющей обратное, то вы никогда не увидите там 220 вольт на фазе из-за этого бита.

Вечером будет время попробую глянуть свой код. Но я точно читал функцией сразу напряжения всех трех фаз для уменьшения количества запросов.

Я видел в документации, что там три функции 11, 14 и 16, Я пользуюсь на данный момент 16, она побайтово считывает напряжение с каждой фазы.

melky
28.04.2018, 13:37
они все побайтово считывают, просто им достаточно 3-х быйт для индикации 220В и около.

3 двоичных байта. Два старших разряда старшего байта указывают положение вектора полной мощности и должны маскироваться. (см. формат ответа).

Читайте очень внимательно документацию. в 11-й функции присутствует указание вектора, скорее всего оно там у них всегда, даже в напряжении. поэтому вы переставляя байты и видите ахинею во всех вариациях перестановки.

Страница 53, соврал, используется 2 старших бита по одному бита на активную и реактивную составляющуюся мощности.
Практика показала, что реактивная обратного направления присутствует даже в частном доме аж бегом...

В любом случае их маскировать необходимо при получении ответа. в общем маска на старший байт в 3-х байтном ответе 3F, далее делайте что хотите с перестановками.

Сема
02.05.2018, 15:20
данные всегда приходят одни и те же? читаетете именно напряжение фазы?
p.s. попробуйте поменять тип запроса в параметре data c 22 на 16#11

Нет, 11 функция не помогла.

вот что он показывает, что-то похожее, но не то.

Сема
02.05.2018, 15:24
они все побайтово считывают, просто им достаточно 3-х быйт для индикации 220В и около.

3 двоичных байта. Два старших разряда старшего байта указывают положение вектора полной мощности и должны маскироваться. (см. формат ответа).

Читайте очень внимательно документацию. в 11-й функции присутствует указание вектора, скорее всего оно там у них всегда, даже в напряжении. поэтому вы переставляя байты и видите ахинею во всех вариациях перестановки.

Страница 53, соврал, используется 2 старших бита по одному бита на активную и реактивную составляющуюся мощности.
Практика показала, что реактивная обратного направления присутствует даже в частном доме аж бегом...

В любом случае их маскировать необходимо при получении ответа. в общем маска на старший байт в 3-х байтном ответе 3F, далее делайте что хотите с перестановками.

То есть по сути, надо сделать некий битовый фильтр? То есть ещё раскрывать каждый байт, фильтровать, опять закрывать в байт, потом делать перестановку??? Я так и не понял, где старший, а где младший байт, где мне присваивать массив?

melky
02.05.2018, 16:16
напишите 3 байта из вашей посылки в 16-м формате
а лучше целиком ответ побайтно на работу функции

Сема
02.05.2018, 20:32
напишите 3 байта из вашей посылки в 16-м формате
а лучше целиком ответ побайтно на работу функции

Честно, я не понял, что надо сделать..

melky
02.05.2018, 20:35
весь ответ счетчика побайтно напишите, и укажите какой функцией ее получили

Scream
03.05.2018, 11:16
Добрый вечер, уважаемые коллеги.

Ну помогите мне пожалуйста, я не могу разобраться с одной вещью. Я пытаюсь подружить СПК207.03.WEB с электросчётчиком Меркурий 234 ART-03 P.

Открыть ком порт и опросить Меркурий через Mercury.lib вроде удалось, но я совсем не понимаю, что мне надо сделать с данными с выхода блока data_buffer. Я понимаю, что байты нужно склеить в определённом порядке. Но я не понимаю в каком. Я прилагаю все скриншоты, в том числе и на инструкцию по протоколу Меркурия. У меня не получилось сделать так, чтобы он вывел мне в real значение напряжения в 1 фазе.

Про описание запроса и ответа напряжения в инструкции начинается со страницы 53. Очень нужна ваша помощь, спасибо!

А где тут на скрине задаётся номер функции(параметра)? Я эту бибку не использовал.

Как получилось в Read_param.parameter_number число 17 ?

---
Тут всё в десятичном, понял. Можно же писать 16#11 и т.д.


В документе меркурия N = 00565Bh = 22423d как-то не получается, должно быть 22107d

И никаких битов направления активной\реактивной мощности тут нет, поэтому никакие биты обнулять не надо при условии запроса как на скрине.

melky
03.05.2018, 12:57
Scream битов нет, потому что в данный момент реактивной составляющей обратного направления НЕТ...

Сема
04.05.2018, 18:59
весь ответ счетчика побайтно напишите, и укажите какой функцией ее получили

В общем пишу ответ.

Функция 8, параметр 16h, данные 17, как по описанию из этой инструкции, ссылка ниже.
напряжение где-то 226,19.

И в выражении (rUa:= SHL(BYTE_TO_DWORD(abyReadData[2]),16) + SHL(BYTE_TO_DWORD(abyReadData[0]),8) + BYTE_TO_DWORD(abyReadData[1]);
где старший, а где младший байт.

Вот вроде бы он отвечает, выдаёт данные, вроде код не супер сложный, но чё-то не получается, что нужно сделать? я окончательно запутался.

Вроде он находит эти три байта, но максимум, что я получил это 181, либо 256. Это из того, что похоже на напряжение.

Сема
04.05.2018, 19:32
Вот я нашёл форматы ответа двух функций 16 и 11, они одинаковые.
И я распаковал три этих байта.
То есть 1-ый байт это abyReadData[0]
И на скриншоте видно, что направления реактивной мощности НЕТ, или куда мне надо смотреть?

melky
05.05.2018, 13:28
Какой у вас адрес счетчика ?

Сейчас не помню, 16 функция это что именно ? чтение массива данных зафиксированных значений ? если да, то вы ничерта не получите от счетчика, так как предварительно надо выполнить эту самую фиксацию значений дополнительной командой.

Вы вообще на линию между ПЛК и счетчиком можете установить ПК и настроить порт на наблюдение данных ? сняли бы себе кучу проблем, а то тыкаетесь как слепой котенок...

Сема
05.05.2018, 13:40
У меня как раз и стоит на прослушке с ПК. Я и написал в предыдущем посте напряжение где-то 226,19.

Адрес счётчика у меня 11.

Сема
05.05.2018, 13:50
Какой у вас адрес счетчика ?

Сейчас не помню, 16 функция это что именно ? чтение массива данных зафиксированных значений ? если да, то вы ничерта не получите от счетчика, так как предварительно надо выполнить эту самую фиксацию значений дополнительной командой.


Какими командами и что за фиксация?

Я запрос делаю один раз пока, и пытаюсь обработать разовый ответ.

В общем, что получилось в итоге. Я попросил подцепить другой счётчик с адресом 5. На нём висит и компьютер и СПК207. Монитор измерений изображён на скриншоте. Я смог опросить только одну фазу, остальные две никак не опрашиваются, я пробовал всеми функциями, у меня назревает вопрос, эта библиотека сама по себе рабочая? Просто я не могу вытащить на остальных фазах напряжение.

melky
05.05.2018, 20:57
А почему у вас и монитор не показывает фазу 1 и 2 ? Если вы слушаете порт, вы вообще можете выложить ЛОГ порта ? или опять все должны догадываться, какие у вас идут запросы и ответы ?

Я использовал 14-ю функцию, вот пример лога, адрес 20

2018-05-05 21:03:01 Сеанс связи с КП 64 "Меркурий236_мгн", тип: KpMercury23x, адрес: 20
Отправка (4): 14 00 0E B0
Приём (4/4): 14 00 0E B0
OK!
Отправка (11): 14 01 01 01 01 01 01 01 01 88 81
Приём (4/4): 14 00 0E B0
OK!
Отправка (5): 14 08 02 B7 C5
Приём (7/7): 14 00 01 00 01 84 03
OK!
Отправка (5): 14 03 08 30 F2
Приём (4/4): 14 00 0E B0
OK!
Отправка (6): 14 08 14 00 8B 16
Приём (19/19): 14 02 40 8A 8F 02 40 19 41 00 00 75 16 00 40 FC 37 9C EA
OK!
Отправка (6): 14 08 14 04 8A D5
Приём (19/19): 14 00 40 B7 D4 00 40 98 AE 00 00 F8 17 00 40 17 3E 71 98
OK!
Отправка (6): 14 08 14 08 8A D0
Приём (19/19): 14 02 40 98 CF 02 40 10 5B 00 00 D8 20 00 40 B0 53 F7 E5
OK!
Отправка (6): 14 08 14 30 8B 02
Приём (15/15): 14 40 8E 03 40 BC 03 00 AB 02 40 9C 02 9B 72
OK!
Отправка (6): 14 08 14 10 8A DA
Приём (12/12): 14 00 49 5A 00 7D 54 00 F0 56 B6 1C
OK!
Отправка (6): 14 08 14 20 8A CE
Приём (12/12): 14 00 15 1A 00 84 01 00 C2 03 AA 36
OK!
Отправка (6): 14 08 14 40 8A E6
Приём (6/6): 14 00 87 13 27 E9
OK!

расположите FB согласно потоку данных в своей схеме. Если честно, я понятия не имею как писали эту библиотеку, никогда не использовал. Но когда писал драйвер для счетчика познал очень многое о нем, например счетчик прямого включения 50(60)А никогда не выдаст полный ток в функциях опроса, кроме 14-й, так как там битов не хватит указать полный ток. Общаясь с разрабами и программистом выяснилось, что те функции оставили для совместимости со старыми счетчиками, когда не было версий прямого включения. Так что пришлось использовать 14-ю функцию, предварительно фиксируя данные.

p.s. а вы случайно счетчик не пытаетесь опрашивать без предварительного открытия канала и авторизации ? Вот по этому я и просил лог обмена между ПЛК и счетчиком показать.... а то что-то мне сдается что вы в закрытую дверь библиотекой долбитесь...

Сема
06.05.2018, 17:28
Вы меня извините, я не понимаю, где мне считать лог порта, как это делается? Я ни разу ни делал подобного

melky
06.05.2018, 18:23
Подключить через преобразователь ПК на линию между ПЛК и счетчиком и настроить порт на режим наблюдения. Я пользуюсь обычно http://www.aggsoft.ru/serial-data-logger/download.htm

достаточно демо режима, не обязательно покупать...

SA104
11.02.2019, 12:49
Доброго времени.

Может кому пригодится - рабочий проект опроса счетчика Меркурий 230 - за основу взят проект автора темы и чуть чуть доработан в плане изменения типа данных и порядка байт. Результат по Квт\часам в переменной - resultat.

Архив проекта - https://cloud.mail.ru/public/EACb/SJGZu2mfJ
Проверен на реальном счетчике и виртуальном контроллере Codesys 3.5 SP11 Patch5 через usb\rs485 конвертер.

Спасибо автору, сэкономил мне кучу времени.