Armadilloフォーラム

RS485を使って温度温度監視ユニットのデータを取得したい。

a-rahman

2024年10月4日 11時20分

いつもお世話になっております。

Thermal Watcher センサーのデータを読み取るためにこのプロセスを実行しましたが、目的の出力が得られません。Thermal Watcher センサーからデータを読み取る方法について教えていただけますか?

使用したもの
I. Armadillo-IoT A6E2.
II. 温度温度監視ユニット Thermal Watcher (仮):
(ア) コントローラ:SRW 100 (仮)
(イ) 温度温度センサー:SSW32 01 (仮)
(ウ) 温度監視ユニット Thermal Watcher用電源

手順

1). 接続方法
Armadillo A6e RS485 をコントローラー RS485 に接続しました。
コントローラ:SRW 100 接続先
G GND
Ta Data+
Tb Data-

2). 必要なパッケージ、ライブラリのインストール。

     apk update
     apk add python3
     apk add python3-pip
     pip3 install pymodbus
     pip3 install pyserial

3). Pythonプログラムの作成

from pymodbus.client import ModbusSerialClient
import logging
 
# Set up logging to track Modbus communication
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
 
def communicate_with_rs485():
    # Initialize Modbus client for RS-485 communication
    client = ModbusSerialClient(
        port='/dev/ttymxc4',   # Serial port
        baudrate=115200,       # Baudrate
        parity='N',            # No parity
        stopbits=1,            # 1 stop bit
        bytesize=8,            # 8 data bits
        timeout=3,              # Timeout in seconds
        method = "rtu"
    )
 
    # Test connection
    if client.connect():
        print("Connected to Modbus device")
    else:
        print("Failed to connect")
        return
 
    try:
        # Step 1: Trigger pixel data update by reading register 30001
        # Read the first register (30001) to initiate a temperature update
        first_reg = client.read_holding_registers(30001, 1, slave=1)
        if not first_reg.isError():
            print(f"Read register 30001: {first_reg.registers}")
        else:
            print("Error reading register 30001")
            return  # Exit if the initial read fails
 
    except Exception as e:
        print(f"Error: {e}")
        return
 
    # Step 2: Read pixel temperature data starting from register 3026
    try:
        start_address = 30026  # Starting address for pixel data
        end_address = 31049   # End address for pixel data
        register_count = 125  # Max count for one read (Modbus RTU limitation)
        all_temperatures = []  # To store all read temperatures
 
        # Loop to read in chunks of registers
        while start_address <= end_address:
            response = client.read_holding_registers(start_address, register_count, slave=1)
            if not response.isError():
                print(f"Read registers from {start_address} to {start_address + register_count - 1}")
                # Convert the raw register values to temperature (divided by 10.0)
                temperatures = [value / 10.0 for value in response.registers]
                all_temperatures.extend(temperatures)
                start_address += register_count  # Move to the next set of registers
            else:
                print(f"Error reading registers from {start_address}")
                break
 
        # Print all the temperature data retrieved
        print(f"All Temperatures: {all_temperatures}")
 
    except Exception as e:
        print(f"Error: {e}")
 
    # Close the connection when done
    client.close()
 
if __name__ == "__main__":
    communicate_with_rs485()
    # main()

出力:
(venv) armadillo:~# python3 rs485.py
Connected to Modbus device.
Read register 30001: [0]
All Temperatures: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,……………………………………………………………………………, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

コメント

at_shota.shimoyama

2024年10月4日 19時22分

下山です。

Thermal Watcherの製品仕様書には「各データの先頭アドレスを0番地とします」との記載がありますので、
30001のアドレスでチャンネル番号を読み出したい場合、
入力レジスタの先頭アドレス(30001)を差し引いた値(0)を指定する必要があるのではないかと思われます。

ですので、

first_reg = client.read_holding_registers(30001, 1, slave=1)

first_reg = client.read_holding_registers(0, 1, slave=1)

と変更した上で再度実行をお願いいたします。

また、同様の理由で
・アドレス30026を読み出したい場合は 30026 - 30001 = 25 を指定
・アドレス31049を読み出したい場合は 31049 - 30001 = 1048 を指定
する必要があると思われます。

よろしくお願いします。

迅速なご返答をありがとうございます。
ご指示に従ってコードを変更したところ、大きな値が得られるようになりました。さらに何をすべきか教えていただけますか?
更新コード:

from pymodbus.client import ModbusSerialClient
import logging
import time
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian
 
# Set up logging to track Modbus communication
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
 
def communicate_with_rs485():
    # Initialize Modbus client for RS-485 communication
    client = ModbusSerialClient(
        port='/dev/ttymxc4',   # Serial port
        baudrate=115200,       # Baudrate
        parity='N',            # No parity
        stopbits=1,            # 1 stop bit
        bytesize=8,            # 8 data bits
        timeout=3              # Timeout in seconds
    )
    # Test connection
    if client.connect():
        print("Connected to Modbus device")
    else:
        print("Failed to connect")
        return
    try:
 
        # Step 1: Trigger pixel data update by reading register 30001
        # Read the first register (30001) to initiate a temperature update
        first_reg = client.read_input_registers(0, 1, slave=1)
        if not first_reg.isError():
            print(f"Read register 30001: {first_reg.registers}")
            # Assuming response.registers contains the registers read
            # decoder = BinaryPayloadDecoder.fromRegisters(first_reg.registers, byteorder=Endian.Big, wordorder=Endian.Big)
            # value = decoder.decode_32bit_float()
            # print(f"Decode Value: {decoder}")
            # print(f"Decoded value: {decoder.decode_16bit_int}")
 
        else:
            print(f"Error code: {first_reg.exception_code}")
            print("Error reading register 30001")
            return  # Exit if the initial read fails
    except Exception as e:
        print(f"Error: {e}")
        return
 
    try:
        start_address = 30026 - 30001  # Starting address for pixel data
        end_address = 31049 - 30001  # End address for pixel data
        register_count = 64  # Max count for one read (Modbus RTU limitation)
 
        all_temperatures = []  # To store all read temperatures
 
        # Loop to read in chunks of registers
        while start_address <= end_address:
            response = client.read_input_registers(start_address, register_count, slave=1)
            if not response.isError():
                print(f"Read registers from {start_address} to {start_address + register_count - 1}")
                # Convert the raw register values to temperature (divided by 10.0)
                temperatures = [value / 10.0 for value in response.registers]
                all_temperatures.extend(temperatures)
                start_address += register_count  # Move to the next set of registers
            else:
                print(f"Error reading registers from {start_address}")
                print(f"Error code: {response.exception_code}")
                break
 
        # Print all the temperature data retrieved
        print(f"All Temperatures: {all_temperatures}")
 
    except Exception as e:
         print(f"Error: {e}") 
 
    # Close the connection when done
    client.close()
 
if __name__ == "__main__":
    while True:
        communicate_with_rs485()
        time.sleep(5)

出力:

[1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 6246.4, 51.3, 6067.2, 6476.8, 6272.0, 512.1, 153.7, 102.5, 204.9, 76.9, 6323.2, 153.7, 6425.6, 6374.4, 25.7, 6451.2, 179.3, 6118.4, 0.1, 0.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 6400.0, 51.3, 6374.4, 6528.0, 6348.8, 256.1, 6220.8, 409.7, 6144.0, 6451.2, 6400.0, 6374.4, 128.1, 0.1, 6374.4, 6195.2, 6528.0, 6374.4, 6246.4, 6067.2, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 6400.0, 6092.8, 6323.2, 6528.0, 358.5, 409.7, 332.9, 6502.4, 51.3, 307.3, 384.1, 179.3, 6323.2, 6425.6, 51.3, 230.5, 6528.0, 6425.6, 6374.4, 6246.4, 6297.6, 25.7, 6400.0, 128.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 6220.8, 6272.0, 6374.4, 537.7, 6425.6, 256.1, 76.9, 102.5, 358.5, 435.3, 307.3, 460.9, 153.7, 230.5, 102.5, 51.3, 6400.0, 25.7, 128.1, 6374.4, 102.5, 0.1, 128.1, 6502.4, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 51.3, 6272.0, 6451.2, 6144.0, 6528.0, 6297.6, 51.3, 6374.4, 6220.8, 128.1, 6425.6, 6476.8, 281.7, 6425.6, 6400.0, 6451.2, 6400.0, 6323.2, 6425.6, 51.3, 6246.4, 6220.8, 6195.2, 6246.4, 6169.6, 6272.0, 6144.0, 5785.6, 1459.1, 1459.1, 1459.1, 1459.1, 5888.0, 6272.0, 6476.8, 6272.0, 6092.8, 51.3, 6425.6, 281.7, 6144.0, 6502.4, 0.1, 102.5, 6476.8, 128.1, 6502.4, 6476.8, 76.9, 25.7, 179.3, 6220.8, 6246.4, 0.1, 6400.0, 6502.4, 6451.2, 6297.6, 6476.8, 6118.4, 1459.1, 1459.1, 5811.2, 5939.2, 6425.6, 6348.8, 307.3, 6348.8, 6323.2, 102.5, 6502.4, 6476.8, 281.7, 179.3, 6246.4, 51.3, 6476.8, 6425.6, 25.7, 6502.4, 102.5, 51.3, 0.1, 76.9, 6195.2, 6451.2, 0.1, 6528.0, 76.9, 6195.2, 6220.8, 6400.0, 179.3, 6169.6, 6246.4, 6400.0, 0.1, 332.9, 0.1, 76.9, 6348.8, 0.1, 153.7, 6400.0, 51.3, 102.5, 6476.8, 6476.8, 6425.6, 6374.4, 76.9, 6323.2, 6502.4, 6348.8, 6502.4, 6476.8, 0.1, 6528.0, 6451.2, 6297.6, 128.1, 153.7, 230.5, 6118.4, 6476.8, 6118.4, 6246.4, 5888.0, 512.1, 76.9, 51.3, 6451.2, 0.1, 102.5, 6502.4, 0.1, 25.7, 6476.8, 25.7, 204.9, 6348.8, 102.5, 25.7, 332.9, 0.1, 6476.8, 6374.4, 6476.8, 6323.2, 0.1, 51.3, 204.9, 6502.4, 435.3, 486.5, 76.9, 25.7, 6348.8, 153.7, 486.5, 691.3, 256.1, 281.7, 435.3, 51.3, 230.5, 6476.8, 256.1, 230.5, 25.7, 204.9, 6451.2, 6400.0, 204.9, 0.1, 6425.6, 6451.2, 6451.2, 6425.6, 128.1, 6528.0, 179.3, 435.3, 153.7, 179.3, 76.9, 102.5, 51.3, 6374.4, 6374.4, 179.3, 6272.0, 870.5, 486.5, 409.7, 691.3, 256.1, 179.3, 230.5, 102.5, 179.3, 307.3, 512.1, 6451.2, 435.3, 512.1, 588.9, 358.5, 358.5, 358.5, 153.7, 6297.6, 0.1, 153.7, 332.9, 435.3, 256.1, 332.9, 102.5, 460.9, 0.1, 332.9, 537.7, 537.7, 1152.1, 1254.5, 768.1, 435.3, 256.1, 128.1, 256.1, 409.7, 435.3, 947.3, 870.5, 563.3, 409.7, 640.1, 563.3, 614.5, 332.9, 204.9, 6323.2, 6528.0, 6476.8, 179.3, 76.9, 204.9, 256.1, 332.9, 25.7, 409.7, 281.7, 6528.0, 179.3, 332.9, 1152.1, 1024.1, 793.7, 179.3, 384.1, 384.1, 512.1, 256.1, 665.7, 1715.3, 896.1, 512.1, 486.5, 358.5, 384.1, 384.1, 435.3, 204.9, 6451.2, 102.5, 6476.8, 6528.0, 6425.6, 153.7, 307.3, 307.3, 307.3, 6476.8, 409.7, 281.7, 6348.8, 716.9, 1254.5, 1536.1, 537.7, 716.9, 512.1, 460.9, 691.3, 614.5, 1408.1, 1433.7, 819.3, 307.3, 332.9, 460.9, 307.3, 384.1, 588.9, 204.9, 6528.0, 6476.8, 204.9, 128.1, 76.9, 51.3, 358.5, 51.3, 25.7, 128.1, 460.9, 435.3, 0.1, 128.1, 870.5, 1152.1, 665.7, 1280.1, 1100.9, 665.7, 563.3, 588.9, 1100.9, 1484.9, 768.1, 614.5, 588.9, 588.9, 307.3, 153.7, 332.9, 204.9, 102.5, 76.9, 204.9, 204.9, 486.5, 51.3, 51.3, 281.7, 256.1, 435.3, 128.1, 6502.4, 6400.0, 537.7, 358.5, 844.9, 460.9, 768.1, 768.1, 665.7, 614.5, 230.5, 742.5, 1408.1, 896.1, 716.9, 665.7, 486.5, 563.3, 640.1, 358.5, 102.5, 204.9, 332.9, 614.5, 486.5, 0.1, 332.9, 230.5, 588.9, 460.9, 512.1, 153.7, 25.7, 204.9, 486.5, 332.9, 307.3, 614.5, 1203.3, 896.1, 537.7, 435.3, 947.3, 947.3, 1203.3, 1280.1, 947.3, 998.5, 793.7, 614.5, 691.3, 512.1, 537.7, 409.7, 409.7, 691.3, 332.9, 614.5, 230.5, 640.1, 665.7, 665.7, 435.3, 332.9, 512.1, 204.9, 204.9, 307.3, 435.3, 281.7, 588.9, 793.7, 742.5, 307.3, 588.9, 742.5, 972.9, 665.7, 1075.3, 1100.9, 716.9, 921.7, 640.1, 870.5, 640.1, 588.9, 102.5, 256.1, 537.7, 921.7, 486.5, 742.5, 486.5, 358.5, 691.3, 768.1, 512.1, 6502.4, 512.1, 691.3, 384.1, 768.1, 588.9, 588.9, 435.3, 486.5, 486.5, 844.9, 921.7, 998.5, 1126.5, 998.5, 972.9, 998.5, 691.3, 896.1, 1049.7, 563.3, 486.5, 665.7, 716.9, 768.1, 588.9, 1126.5, 665.7, 768.1, 435.3, 691.3, 921.7, 537.7, 256.1, 332.9, 332.9, 512.1, 716.9, 691.3, 588.9, 742.5, 819.3, 640.1, 998.5, 819.3, 1024.1, 998.5, 844.9, 1126.5, 1024.1, 896.1, 563.3, 537.7, 793.7, 1177.7, 972.9, 947.3, 665.7, 588.9, 640.1, 409.7, 870.5, 486.5, 1024.1, 460.9, 102.5, 460.9, 460.9, 332.9, 460.9, 870.5, 512.1, 691.3, 614.5, 640.1, 563.3, 896.1, 844.9, 614.5, 947.3, 1075.3, 1254.5, 665.7, 870.5, 1075.3, 1075.3, 1587.3, 1561.7, 1228.9, 1203.3, 998.5, 896.1, 896.1, 665.7, 460.9, 537.7, 332.9, 358.5, 588.9, 256.1, 384.1, 512.1, 409.7, 435.3, 435.3, 614.5, 332.9, 614.5, 537.7, 409.7, 742.5, 819.3, 947.3, 563.3, 716.9, 947.3, 1100.9, 1203.3, 1561.7, 1254.5, 1638.5, 1382.5, 1331.3, 1254.5, 1715.3, 947.3, 819.3, 614.5, 6528.0, 51.3, 665.7, 384.1, 588.9, 793.7, 844.9, 691.3, 358.5, 358.5, 588.9, 563.3, 537.7, 358.5, 844.9, 972.9, 1075.3, 844.9, 896.1, 1126.5, 1203.3, 1331.3, 1510.5, 1920.1, 2432.1, 1868.9, 1715.3, 1331.3, 1177.7, 640.1, 588.9, 921.7, 281.7, 6374.4, 0.1, 793.7, 844.9, 1177.7, 870.5, 691.3, 691.3, 768.1, 435.3, 537.7, 460.9, 384.1, 819.3, 921.7, 1024.1, 1305.7, 1536.1, 1612.9, 1254.5, 1459.3, 1817.7, 1971.3, 2252.9, 1971.3, 1100.9, 1356.9, 819.3, 1100.9, 512.1, 768.1, 0.1, 307.3, 0.1, 6348.8, 563.3, 947.3, 691.3, 691.3, 588.9, 435.3, 358.5, 512.1, 512.1, 204.9, 691.3, 819.3, 870.5, 1305.7, 1638.5, 1382.5, 1561.7, 1715.3, 1715.3, 2534.5, 2201.7, 1945.7, 1305.7, 1100.9, 665.7, 998.5, 691.3, 1331.3, 307.3, 460.9, 5990.4, 76.9, 844.9, 614.5, 819.3, 537.7, 537.7, 256.1, 640.1, 588.9, 307.3, 588.9, 563.3, 614.5, 1228.9, 1536.1, 1536.1, 1894.5, 1536.1, 1766.5, 2099.3, 2176.1, 2150.5, 1817.7, 1254.5, 1152.1, 1152.1, 588.9, 793.7, 1408.1, 1459.1, 1459.1, 460.9, 128.1, 691.3, 588.9, 665.7, 281.7, 486.5, 204.9, 384.1, 588.9, 51.3, 742.5, 896.1, 819.3, 1177.7, 1254.5, 1792.1, 1843.3, 2022.5, 1996.9, 2278.5, 2201.7, 2304.1, 1664.1, 1331.3, 1075.3, 793.7, 1126.5, 1459.1, 1459.1, 1459.1, 1459.1, 6451.2, 6374.4, 0.1, 384.1, 76.9, 128.1, 768.1, 588.9, 588.9, 563.3, 563.3, 563.3, 486.5, 435.3, 1100.9, 1203.3, 1382.5, 1587.3, 1920.1, 1843.3, 3123.3, 2662.5, 1996.9, 1356.9, 870.5, 921.7, 742.5, 1228.9, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 358.5, 256.1, 614.5, 281.7, 1049.7, 640.1, 665.7, 640.1, 1126.5, 793.7, 716.9, 1049.7, 1126.5, 1868.9, 1868.9, 1971.3, 2329.7, 2867.3, 2816.1, 2483.3, 1843.3, 1280.1, 1254.5, 1177.7, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 128.1, 51.3, 281.7, 537.7, 716.9, 716.9, 409.7, 972.9, 1177.7, 844.9, 896.1, 384.1, 972.9, 1868.9, 1920.1, 1868.9, 2483.3, 2944.1, 2892.9, 2022.5, 1536.1, 1100.9, 691.3, 665.7, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 512.1, 332.9, 716.9, 1177.7, 947.3, 844.9, 972.9, 1100.9, 947.3, 844.9, 1408.1, 1356.9, 1971.3, 2252.9, 2560.1, 3020.9, 2380.9, 2022.5, 1075.3, 1382.5, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 384.1, 486.5, 6502.4, 793.7, 1049.7, 1049.7, 921.7, 947.3, 844.9, 1408.1, 1024.1, 1203.3, 2022.5, 2406.5, 2867.3, 2432.1, 2099.3, 2073.7, 1587.3, 1868.9, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1, 1459.1]

何卒よろしくお願い申し上げます。

at_shota.shimoyama

2024年10月10日 17時38分

下山です。

添付いただいた出力について、下位8bitと上位8bitを入れ替えてみたところ、
以下のように一見正しそうな結果と添付画像のとおりになりました。

[[-20.  -20.  -20.  -20.  -20.  -20.   24.4  25.8  23.7  25.3  24.5  27.6
   26.2  26.   26.4  25.9  24.7  26.2  25.1  24.9  25.7  25.2  26.3  23.9
   25.6  25.6 -20.  -20.  -20.  -20.  -20.  -20. ]
 [-20.  -20.  -20.  -20.  -20.  -20.   25.   25.8  24.9  25.5  24.8  26.6
   24.3  27.2  24.   25.2  25.   24.9  26.1  25.6  24.9  24.2  25.5  24.9
   24.4  23.7 -20.  -20.  -20.  -20.  -20.  -20. ]
 [-20.  -20.  -20.  -20.   25.   23.8  24.7  25.5  27.   27.2  26.9  25.4
   25.8  26.8  27.1  26.3  24.7  25.1  25.8  26.5  25.5  25.1  24.9  24.4
   24.6  25.7  25.   26.1 -20.  -20.  -20.  -20. ]
 [-20.  -20.  -20.  -20.   24.3  24.5  24.9  27.7  25.1  26.6  25.9  26.
   27.   27.3  26.8  27.4  26.2  26.5  26.   25.8  25.   25.7  26.1  24.9
   26.   25.6  26.1  25.4 -20.  -20.  -20.  -20. ]
 [-20.  -20.   25.8  24.5  25.2  24.   25.5  24.6  25.8  24.9  24.3  26.1
   25.1  25.3  26.7  25.1  25.   25.2  25.   24.7  25.1  25.8  24.4  24.3
   24.2  24.4  24.1  24.5  24.   22.6 -20.  -20. ]
 [-20.  -20.   23.   24.5  25.3  24.5  23.8  25.8  25.1  26.7  24.   25.4
   25.6  26.   25.3  26.1  25.4  25.3  25.9  25.7  26.3  24.3  24.4  25.6
   25.   25.4  25.2  24.6  25.3  23.9 -20.  -20. ]
 [ 22.7  23.2  25.1  24.8  26.8  24.8  24.7  26.   25.4  25.3  26.7  26.3
   24.4  25.8  25.3  25.1  25.7  25.4  26.   25.8  25.6  25.9  24.2  25.2
   25.6  25.5  25.9  24.2  24.3  25.   26.3  24.1]
 [ 24.4  25.   25.6  26.9  25.6  25.9  24.8  25.6  26.2  25.   25.8  26.
   25.3  25.3  25.1  24.9  25.9  24.7  25.4  24.8  25.4  25.3  25.6  25.5
   25.2  24.6  26.1  26.2  26.5  23.9  25.3  23.9]
 [ 24.4  23.   27.6  25.9  25.8  25.2  25.6  26.   25.4  25.6  25.7  25.3
   25.7  26.4  24.8  26.   25.7  26.9  25.6  25.3  24.9  25.3  24.7  25.6
   25.8  26.4  25.4  27.3  27.5  25.9  25.7  24.8]
 [ 26.2  27.5  28.3  26.6  26.7  27.3  25.8  26.5  25.3  26.6  26.5  25.7
   26.4  25.2  25.   26.4  25.6  25.1  25.2  25.2  25.1  26.1  25.5  26.3
   27.3  26.2  26.3  25.9  26.   25.8  24.9  24.9]
 [ 26.3  24.5  29.   27.5  27.2  28.3  26.6  26.3  26.5  26.   26.3  26.8
   27.6  25.2  27.3  27.6  27.9  27.   27.   27.   26.2  24.6  25.6  26.2
   26.9  27.3  26.6  26.9  26.   27.4  25.6  26.9]
 [ 27.7  27.7  30.1  30.5  28.6  27.3  26.6  26.1  26.6  27.2  27.3  29.3
   29.   27.8  27.2  28.1  27.8  28.   26.9  26.4  24.7  25.5  25.3  26.3
   25.9  26.4  26.6  26.9  25.7  27.2  26.7  25.5]
 [ 26.3  26.9  30.1  29.6  28.7  26.3  27.1  27.1  27.6  26.6  28.2  32.3
   29.1  27.6  27.5  27.   27.1  27.1  27.3  26.4  25.2  26.   25.3  25.5
   25.1  26.2  26.8  26.8  26.8  25.3  27.2  26.7]
 [ 24.8  28.4  30.5  31.6  27.7  28.4  27.6  27.4  28.3  28.   31.1  31.2
   28.8  26.8  26.9  27.4  26.8  27.1  27.9  26.4  25.5  25.3  26.4  26.1
   25.9  25.8  27.   25.8  25.7  26.1  27.4  27.3]
 [ 25.6  26.1  29.   30.1  28.2  30.6  29.9  28.2  27.8  27.9  29.9  31.4
   28.6  28.   27.9  27.9  26.8  26.2  26.9  26.4  26.   25.9  26.4  26.4
   27.5  25.8  25.8  26.7  26.6  27.3  26.1  25.4]
 [ 25.   27.7  27.   28.9  27.4  28.6  28.6  28.2  28.   26.5  28.5  31.1
   29.1  28.4  28.2  27.5  27.8  28.1  27.   26.   26.4  26.9  28.   27.5
   25.6  26.9  26.5  27.9  27.4  27.6  26.2  25.7]
 [ 26.4  27.5  26.9  26.8  28.   30.3  29.1  27.7  27.3  29.3  29.3  30.3
   30.6  29.3  29.5  28.7  28.   28.3  27.6  27.7  27.2  27.2  28.3  26.9
   28.   26.5  28.1  28.2  28.2  27.3  26.9  27.6]
 [ 26.4  26.4  26.8  27.3  26.7  27.9  28.7  28.5  26.8  27.9  28.5  29.4
   28.2  29.8  29.9  28.4  29.2  28.1  29.   28.1  27.9  26.   26.6  27.7
   29.2  27.5  28.5  27.5  27.   28.3  28.6  27.6]
 [ 25.4  27.6  28.3  27.1  28.6  27.9  27.9  27.3  27.5  27.5  28.9  29.2
   29.5  30.   29.5  29.4  29.5  28.3  29.1  29.7  27.8  27.5  28.2  28.4
   28.6  27.9  30.   28.2  28.6  27.3  28.3  29.2]
 [ 27.7  26.6  26.9  26.9  27.6  28.4  28.3  27.9  28.5  28.8  28.1  29.5
   28.8  29.6  29.5  28.9  30.   29.6  29.1  27.8  27.7  28.7  30.2  29.4
   29.3  28.2  27.9  28.1  27.2  29.   27.5  29.6]
 [ 27.4  26.   27.4  27.4  26.9  27.4  29.   27.6  28.3  28.   28.1  27.8
   29.1  28.9  28.   29.3  29.8  30.5  28.2  29.   29.8  29.8  31.8  31.7
   30.4  30.3  29.5  29.1  29.1  28.2  27.4  27.7]
 [ 26.9  27.   27.9  26.6  27.1  27.6  27.2  27.3  27.3  28.   26.9  28.
   27.7  27.2  28.5  28.8  29.3  27.8  28.4  29.3  29.9  30.3  31.7  30.5
   32.   31.   30.8  30.5  32.3  29.3  28.8  28. ]
 [ 25.5  25.8  28.2  27.1  27.9  28.7  28.9  28.3  27.   27.   27.9  27.8
   27.7  27.   28.9  29.4  29.8  28.9  29.1  30.   30.3  30.8  31.5  33.1
   35.1  32.9  32.3  30.8  30.2  28.1  27.9  29.2]
 [ 26.7  24.9  25.6  28.7  28.9  30.2  29.   28.3  28.3  28.6  27.3  27.7
   27.4  27.1  28.8  29.2  29.6  30.7  31.6  31.9  30.5  31.3  32.7  33.3
   34.4  33.3  29.9  30.9  28.8  29.9  27.6  28.6]
 [ 25.6  26.8  25.6  24.8  27.8  29.3  28.3  28.3  27.9  27.3  27.   27.6
   27.6  26.4  28.3  28.8  29.   30.7  32.   31.   31.7  32.3  32.3  35.5
   34.2  33.2  30.7  29.9  28.2  29.5  28.3  30.8]
 [ 26.8  27.4  23.4  25.9  28.9  28.   28.8  27.7  27.7  26.6  28.1  27.9
   26.8  27.9  27.8  28.   30.4  31.6  31.6  33.   31.6  32.5  33.8  34.1
   34.   32.7  30.5  30.1  30.1  27.9  28.7  31.1]
 [-20.  -20.   27.4  26.1  28.3  27.9  28.2  26.7  27.5  26.4  27.1  27.9
   25.8  28.5  29.1  28.8  30.2  30.5  32.6  32.8  33.5  33.4  34.5  34.2
   34.6  32.1  30.8  29.8  28.7  30.  -20.  -20. ]
 [-20.  -20.   25.2  24.9  25.6  27.1  25.9  26.1  28.6  27.9  27.9  27.8
   27.8  27.8  27.5  27.3  29.9  30.3  31.   31.8  33.1  32.8  37.8  36.
   33.4  30.9  29.   29.2  28.5  30.4 -20.  -20. ]
 [-20.  -20.  -20.  -20.   27.   26.6  28.   26.7  29.7  28.1  28.2  28.1
   30.   28.7  28.4  29.7  30.   32.9  32.9  33.3  34.7  36.8  36.6  35.3
   32.8  30.6  30.5  30.2 -20.  -20.  -20.  -20. ]
 [-20.  -20.  -20.  -20.   26.1  25.8  26.7  27.7  28.4  28.4  27.2  29.4
   30.2  28.9  29.1  27.1  29.4  32.9  33.1  32.9  35.3  37.1  36.9  33.5
   31.6  29.9  28.3  28.2 -20.  -20.  -20.  -20. ]
 [-20.  -20.  -20.  -20.  -20.  -20.   27.6  26.9  28.4  30.2  29.3  28.9
   29.4  29.9  29.3  28.9  31.1  30.9  33.3  34.4  35.6  37.4  34.9  33.5
   29.8  31.  -20.  -20.  -20.  -20.  -20.  -20. ]
 [-20.  -20.  -20.  -20.  -20.  -20.   27.1  27.5  25.4  28.7  29.7  29.7
   29.2  29.3  28.9  31.1  29.6  30.3  33.5  35.   36.8  35.1  33.8  33.7
   31.8  32.9 -20.  -20.  -20.  -20.  -20.  -20. ]]

ですので、おそらくデータを読み出す際のエンディアンの違い(リトルエンディアン・ビッグエンディアン)が原因ではないかと思われます。

Thermal Watcherの製品仕様書によると、[ ]で囲まれていないアドレスで読み取るとリトルエンディアンで出力され、[ ]で囲まれた緑色のアドレスで読み取るとビッグエンディアンで出力されるようです。
[ ]で囲まれていないアドレスを指定している今回の場合は、Armadillo側でリトルエンディアンとして読み取る必要があります。

まずは検証のため、アドレス 39004から39011 の「システム名称"contSRW100"」を読み出して、数値のまま表示いただいてもよろしいでしょうか?
(これも39004~39011から30001を引いた数値を入力してください)
ご質問者様の環境のデフォルトのエンディアンがリトルエンディアンとビッグエンディアンのどちらなのかを確認いたします。

よろしくお願いします。

ファイル ファイルの説明
thermal.png