Добавить поддержку GAS 167 и УМП, улучшить обмен по CAN и последовательному порту
This commit is contained in:
@@ -17,6 +17,8 @@ from dataclasses import dataclass, field
|
||||
from enum import IntEnum
|
||||
from typing import List, Optional
|
||||
|
||||
from .gas_167 import assigned_metadata, describe_word
|
||||
|
||||
try:
|
||||
from .native import get_native_core
|
||||
_SHARED_PROTOCOL = get_native_core()
|
||||
@@ -114,7 +116,7 @@ MSGTYPE_RU = {
|
||||
MsgType.BROADCAST: "Broadcast",
|
||||
MsgType.DISCRETE: "Discrete",
|
||||
MsgType.ANALOG: "Analog",
|
||||
MsgType.GENERAL_ADDRESS_SPACE: "General Address Space",
|
||||
MsgType.GENERAL_ADDRESS_SPACE: "GAS (General Address Space)",
|
||||
MsgType.MODBUS_COIL: "Modbus Coil",
|
||||
MsgType.MODBUS_DISCRETE: "Modbus Discrete",
|
||||
MsgType.MODBUS_HOLDING: "Modbus Holding",
|
||||
@@ -622,11 +624,49 @@ def _decode_gas(res: Decoded) -> None:
|
||||
return
|
||||
for adr, v in res.registers:
|
||||
res.fields.append((" Reg 0x%04X" % adr, "0x%04X (%d)" % (v, v)))
|
||||
_append_gas_metadata(res, adr)
|
||||
if not vals:
|
||||
_append_gas_metadata(res, start)
|
||||
if vals:
|
||||
res.summary = "GAS: %d рег. с 0x%04X = %s" % (
|
||||
len(vals), start, " ".join("%04X" % v for v in vals))
|
||||
else:
|
||||
res.summary = "GAS: запрос по адресу 0x%04X" % start
|
||||
# Every monitor, manual decoder and export uses this shared summary.
|
||||
# Keep names in the summary as well as in the expandable field list.
|
||||
addresses = res.registers if vals else [(start, None)]
|
||||
if any(assigned_metadata(address) for address, _value in addresses):
|
||||
words = []
|
||||
for address, value in addresses:
|
||||
entry = assigned_metadata(address)
|
||||
label = "ID %d (0x%04X)" % (address, address)
|
||||
if entry:
|
||||
label = "УМП %d · %s · %s" % (
|
||||
entry['node'] - 4, label, entry['name'])
|
||||
else:
|
||||
label += " · имя не назначено"
|
||||
if value is not None:
|
||||
label += " = %d [0x%04X]" % (value, value)
|
||||
description = describe_word(entry['modbus'], value) if entry else ''
|
||||
if description:
|
||||
label += " — " + description
|
||||
res.fields.append((" GAS ID %d / биты" % address, description))
|
||||
words.append(label)
|
||||
res.summary = ("GAS: " if vals else "GAS запрос: ") + "; ".join(words)
|
||||
|
||||
|
||||
def _append_gas_metadata(res: Decoded, address: int) -> None:
|
||||
entry = assigned_metadata(address)
|
||||
if not entry:
|
||||
return
|
||||
label = " GAS ID %d" % address
|
||||
res.fields += [
|
||||
(label, "УМП %d — %s" % (entry['node'] - 4, entry['name'])),
|
||||
(label + " / статус", entry['status']),
|
||||
(label + " / Modbus 167/v1", "0x%04X" % entry['modbus']),
|
||||
(label + " / GAS 167/v1", "0x%04X" % entry['legacy_address']),
|
||||
(label + " / доступ", entry['access']),
|
||||
]
|
||||
|
||||
|
||||
def _decode_modbus_bit(res: Decoded) -> None:
|
||||
|
||||
Reference in New Issue
Block a user