Счётчик ABB E31

Sep 01, 2021 13:11

Ковыряю тут выше обозначенный счётчик.
Хочу с него по ModBus снимать показания.

Конечно, его родная карта регистров оставляет чувство недосказанности. Но кое-как научился с него считывать текущие значения.
Чтобы что-то записать в него, пришлось натравить родную программу, т.к. описания, что ему надо сказать, чтобы он разрешил в себя запись, нигде не нашлось.
Для тех, у кого есть трудности с подключением родного ПО, приведу лог, который пишет сама программа.

17:25:35.316 | Открываю соединение, протокол MODBUS

01.08.2021 | PC --> Port [17]:
17:25:35.316 | F7 41 53 00 00 04 08 FF FF FF FF FF FF FF FF 55 |÷AS....ÿÿÿÿÿÿÿÿU
| 3E |>

01.08.2021 | PC <-- Port [8]:
17:25:35.377 | F7 41 53 00 00 04 39 D4 |÷AS...9Ô

01.08.2021 | PC --> Port [8]:
17:25:35.377 | F7 03 50 13 00 04 B0 5A |÷.P...°Z

01.08.2021 | PC <-- Port [13]:
17:25:35.429 | F7 03 08 27 00 71 60 00 00 00 F7 00 CD |÷..'.q`...÷.Í

01.08.2021 | PC --> Port [8]:
17:25:35.429 | F7 03 50 1F 00 01 B0 5A |÷.P...°Z

01.08.2021 | PC <-- Port [7]:
17:25:35.472 | F7 03 02 00 01 B1 91 |÷....±

01.08.2021 | ABBMT:
17:25:35.472 | Устанавливаю модель

01.08.2021 | ABBMT:
17:25:35.472 | перестраиваю EMD

01.08.2021 |
17:25:35.472 | EMD ident: Режим поддержки 1

01.08.2021 | ABBMT:
17:25:35.472 | Устройство опознано (0001)

01.08.2021 |
17:25:35.481 | Чтение Серийный номер

01.08.2021 | PC --> Port [8]:
17:25:35.481 | F7 03 50 13 00 02 30 58 |÷.P...0X

01.08.2021 | PC <-- Port [9]:
17:25:35.524 | F7 03 04 27 00 71 60 42 F0 |÷..'.q`Bð

01.08.2021 |
17:25:35.524 | Успешное чтение Серийный номер

01.08.2021 |
17:25:35.524 | Чтение Версия прошивки

01.08.2021 | PC --> Port [8]:
17:25:35.524 | F7 03 53 10 00 04 40 1E |÷.S...@.

01.08.2021 | PC <-- Port [13]:
17:25:35.584 | F7 03 08 30 33 31 2D 31 31 30 32 EA 8A |÷..031-1102ê

01.08.2021 |
17:25:35.584 | Успешное чтение Версия прошивки

01.08.2021 |
17:25:35.584 | Чтение Модель устройства

01.08.2021 | PC --> Port [8]:
17:25:35.584 | F7 03 50 1F 00 01 B0 5A |÷.P...°Z

01.08.2021 | PC <-- Port [7]:
17:25:35.619 | F7 03 02 00 01 B1 91 |÷....±

01.08.2021 |
17:25:35.619 | Успешное чтение Модель устройства

01.08.2021 |
17:25:35.619 | Чтение Идентификация

01.08.2021 | PC --> Port [8]:
17:25:35.619 | F7 03 50 13 00 1A 30 52 |÷.P...0R
01.08.2021 | PC <-- Port [57]:
17:25:35.809 | F7 03 34 27 00 71 60 00 00 00 F7 FF FF FF FF FF |÷.4'.q`...÷ÿÿÿÿÿ
| FF FF FF FF FF FF FF FF FF FF FF 00 01 32 37 30 |ÿÿÿÿÿÿÿÿÿÿÿ..270
| 30 37 31 36 30 FF FF 30 30 30 30 30 30 30 30 30 |07160ÿÿ000000000
| 30 30 30 30 30 30 30 B9 26 |0000000¹&

01.08.2021 |
17:25:35.809 | Успешное чтение Идентификация

На сколько я понял, весь секрет в первой посылке с кодом доступа. И вот после того, как родная программа отправила этот код доступа, счётчик разрешил себя программировать. Замечу, что настройки с завода были, что "разрешено программирование без кода" и "не обращать внимание на крышку контактов".
И вот столкнувшись с этой проблемой, в моём мозгу начала закрадываться мысль, что прошивку для счётчика писали странные люди.
Вчера же эта мысль подтвердилась.
У счётчика можно запросить через ModBus текущее время. Из консоли в Линукс с использованием ModBus TCP шлюза это будет выглядеть вот так:

% mbpoll -p 502 -a 247 -m tcp -0 -t 3:hex -r 20495 -c 3 -1 10.254.252.80
........
-- Polling slave 247...
[20495]: 0x1508
[20496]: 0x1F11
[20497]: 0x0902

И в принципе, всё выглядит более менее логично. 6 байт: первый - год (последние две цифры), второй - месяц... последний - секунды. Для тех кто в танке, оно здесь в шестнадцатеричной форме записано. Т.е. 0x15 если перевести в десятичную форму, то будет, как раз, 21. Время из примера: 2021.08.31 17:09:02. Всё это относительно легко и просто обрабатывается программно.
Но вот я решил прочитать запись из журнала. Счётчик этот хранит в своей памяти показания за последние 12 месяцев, при этом, число и час, когда надо зафиксировать показания в журнале, отдельно настраиваются. Но сейчас не об этом. Смысл в том, что счётчик запоминает время, когда были зафиксированы эти показания. И вот я получаю время фиксации для первой записи (первая запись, по сути, это текущие показания):

% mbpoll -p 502 -a 247 -m tcp -0 -t 3:hex -r 32784 -c 3 -1 10.254.252.80
........
-- Polling slave 247...
[32784]: 0x2108
[32785]: 0x3117
[32786]: 0x0956

И вот тут наблюдательный читатель заметит, что творится какая-то хрень. Почему, вроде как, текущие показания имеют время фиксации 2033.08.49 23:09:86? А всё потому, что писал прошивку кто-то альтернативно одарённый. Он зачем-то решил в журнале время указывать не в шестнадцатеричке, а в десятичке поверх шестнадцатерички.
Не, я конечно понимаю, что вот так в отладке оно красиво выглядит, не надо ничего пересчитывать, сразу видно время. Но, блин, я же это не вручную буду смотреть, а программой. Для кого это всё? Зачем придумывать две разные функции хранения времени? А ведь это значит, что в родной программе пришлось писать две разных функции разбора полученного со счётчика времени. И самое главное, я понимаю, что на компьютере нет больших проблем преобразовать вот этот идиотский формат времени из журнала в понятный машине. Но ведь это преобразование запихали в сам счётчик, а там не безграничные ресурсы. И вот после этого становится понятно, почему после выставления номера записи, которую я хочу считать из счётчика, надо подождать не меньше секунды, прежде чем считывать показания. Наверное, он эту секунду преобразует дату :)

Ну и отдельные лучи ненависти производителю сего девайса за то, что родную программу не обучил работать через ModBus TCP, и что нет версии для Линукс, а виндовая под Wine'ом постоянно падает (хотя, тут, может быть, у меня wine старый и криво настроен).

кулибничество, железо, российское ПО, линукс, linux, электрика

Previous post Next post
Up