Коллеги, добрый день!

Возникла у нас проблема: поменяли несколько приборов ТЭМ-104. Прошивка у приборов не изменилась — S10X v3.07 и осталась как и на старых версиях. ТЭМ-104 - это прибор учёта теплоносителя. При опросе использовали следующие адреса регистров:

8704 — температура ПТР
8708 — температура ОТР
8768 — объёмный расход теплоносителя ПТР
8772 — объёмный расход теплоносителя ОТР

⚠️ Проблема

В регистрах нуль. Посмотрели логи, data → 00 00, то есть буквально прибор отвечает нормально, но в кадре данных нуль (00 00). Нас интересовали мгновенные (real-time) параметры для отображения на мнемосхеме:

  • температура

  • давление (при наличии датчика)

  • объемный расход

Очевидно, что данные куда-то переехали, в другую область памяти (любия фишка производителя).

? Проверка гипотезы

Встал вопрос, а что делать, как достать данные из прибора? Первая мысль, проверить, а шлет ли прибор вообще real-time данные. Подключились через Tesmastat (заводское ПО), прочитали мгновенные и архивные показания, проблем нет (скриншот прилагаю). Значит проблема не в приборах, а в адресах регистров.

? Решение

Решили, что надо подсмотреть, какие запроса отправляет Tesmastat и какие ответы получает, то есть проверить логику работы request/response. Wireshark отпал сразу, так как отдел защиты информации запрещает перехватывать трафик ЛВС. Решили локально перехватить трафик при общении между Tesmastat и TЭМ-104 и написать свой скрипт - sniffer.

Sniffer (подключение через rs-485/232)

Sniffer № 1 

$max_len_request=1024
$max_len_response=1024
$sleep = 1000

$out=New-Object System.IO.Ports.SerialPort COM4, 9600, None,8,one
$in=New-Object System.IO.Ports.SerialPort COM14, 9600, None,8,one
$latin1 = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
$in.Encoding = $latin1
$out.Encoding = $latin1


try {
    $in.Open()
    $out.Open()
    while ($true) {
        if ($out.BytesToRead -gt 0) {
            [byte[]]$data = New-Object byte[] $max_len_response
            $count_byte_response = $out.Read($data, 0, $max_len_response)
            $in.Write($data, 0, $count_byte_response)
            Write-Host ("Ответ:")  -ForegroundColor Red
            Write-Host ($data[0..($count_byte_response - 1)] | ForEach-Object { "{0:X2}" -f $_})  -ForegroundColor Red
            Write-Host ("Длина: $count_byte_response" )  -ForegroundColor Red
            Write-Host "`n" -NoNewLine
        }

        [System.Threading.Thread]::Sleep($sleep)

        if ($in.BytesToRead -gt 0) {            
            [byte[]]$data = New-Object byte[] $max_len_request
            $count_byte_request = $in.Read($data, 0, $max_len_request)
            $out.Write($data, 0, $count_byte_request)
            Write-Host ("Запрос:" )  -ForegroundColor Green
            Write-Host ($data[0..($count_byte_request - 1)] | ForEach-Object { "{0:X2}" -f $_}) -ForegroundColor Green
            Write-Host ("Длина: $count_byte_request" )  -ForegroundColor Green
            Write-Host "`n" -NoNewLine
        }
        
    }
} finally {
    $in.Close()
    $out.Close()
}

Можно было выполнить подключение через Moxa NPort, но суть не меняется.

?️ Реализация

  1. Запускаем Tesmastat

  2. Запрашиваем мгновенные значения

  3. Перехватываем весь трафик

  4. Анализируем перехваченный трафик

Получаем сырой request/response.. Приступаем к реализации.

? Чтение текущих данных

? Пример перехвата

? Поиск значений

Для поиска нужных значений, взяли в Tesmastat мгновенные показания, для температуры: 65 градусов по трубопроводу ОТР –> переводим в HEX и ищем в перехвате совпадение. Таким образом находим нужный блок данных, понимаем, на какой адрес он пришел и определяем адрес регистра.

? Результат

В итоге нашли следующие регистры:

  • ПТР расход теплоносителя57992

  • ОТР расход теплоносителя57996

  • ПТР температура теплоносителя57856

  • ОТП температура теплоносителя57860

Для работы нашей мнемосхемы этого достаточно.

Заключение

Для работы приходится выдвигаться в место непосредственной локации прибора. Если у вас нет проблем с информационной безопасностью, то всё это можно делать непосредственно с рабочего места (не забудт остановить опрос со стороны автоматизированной системы).

Теперь сразу отвечу тем, кто скажет: а почему вы не взяли описание протокола опроса прибора. Потому что там внятно не описано, где искать real-time показания, плюс к тому же есть смещение. Мы искали информацию, звонили поставщикам. Были варианты, но они не сработали.

Кстати, сейчас также встаёт вопрос с выгрузкой архивов, но там всё сложнее, возможно, некорректно настроена логика опроса на уровне самой системы учёта, что лечится только корректировкой последней.

Спасибо всем, кто дочитал!

Надеюсь, этот опыт будет полезен.

Комментарии (13)


  1. cybersonner
    01.05.2026 13:26

    Похожую проблему решал- искал регистры у ПЛК, где хранятся результаты измерения температуры (думал поточнее найти, с разрешением больше заявленных 0,1)- просто скриптом прочитал все регистры, затем нагрел датчик, прочитал снова- получил список изменившихся, сидел, долго думал-нет такого регистра.


    1. maksys2011 Автор
      01.05.2026 13:26

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


      1. cybersonner
        01.05.2026 13:26

        Ну я попробовал. Конкретный ПЛК только holding отдавал. Я просто прочитал все его регистры по всем адресам)


        1. maksys2011 Автор
          01.05.2026 13:26

          Понял. А какой у вас был ПЛК? Хочется глянуть, как у него устроена память.


          1. cybersonner
            01.05.2026 13:26

            Получается соврал я. Поискал, повспоминал- был какой-то из измерителей или регуляторов ТЕРМОДАТ (возможно Термодат-16).


  1. Moog_Prodigy
    01.05.2026 13:26

    Wireshark отпал сразу, так как отдел защиты информации запрещает перехватывать трафик ЛВС. Решили локально перехватить трафик

    Вот тут не понял. Безопасники еще и в асутп влезать запрещают асутпшнику? И при этом он таки влез в обмен, написав свой скрипт?


    1. maksys2011 Автор
      01.05.2026 13:26

      Я не перехватывал трафик в ЛВС. Работали локально - прибор был отключён от сети, подключились к нему напрямую с ноутбука. У нас требования ИБ жёсткие, поэтому никакого перехвата в сети не делали.


      1. Azeront
        01.05.2026 13:26

        Из вашей статьи, фраза о запрете перехвата трафика воспринимается как административно-правовое ограничение, а не как применение технических средств противодействия мониторингу трафика. Если это так, то не понятно, от кого защищают трафик.


        1. maksys2011 Автор
          01.05.2026 13:26

          Имею в виду обычные внутренние регламенты по ИБ. В рабочей сети не используем инструменты перехвата трафика. Поэтому в таких задачах проще работать локально с устройством.


          1. Moog_Prodigy
            01.05.2026 13:26

            Ну так локально бы wiresharkом бы и перехватили, на локальный ноут без подключения к сети вообще. Ему не нужна сеть и интернет, он слушает только конкретный интерфейс и всё. Зачем вообще понадобилось так все усложнять?


            1. maksys2011 Автор
              01.05.2026 13:26

              Wireshark это первое, что приходит в голову. Но в реальности не всегда есть возможность его быстро развернуть. В нашем случае были ограничения по ОС, драйверам и политике ИБ на рабочем ноутбуке. Поэтому пошли от задачи сделалав минимальный сниффер под конкретный протокол и получили результат быстрее, чем настраивали бы инструмент. Не всегда есть возможнсть сделать правильно.


  1. KapterI
    01.05.2026 13:26

    Техподдержка производителя не предоставила адреса регистров? В разное время установленных теплосчетчиках разные регистры, и понять где какие нельзя ни по версии прибора ни по прошивке?

    Не нужны вам такие приборы.


  1. maksys2011 Автор
    01.05.2026 13:26

    Обычно работаешь с тем, что уже установлено или установили: разные версии, поставщики и не всегда актуальная документация. Техподдержка, к сожалению, тоже не помогла. Поэтому пришлось разбираться по фактическим ответам прибора. В целом Вы правы на счет техподдержки.