Объедини Modbus в один тип с функциями и количеством 1–4
This commit is contained in:
@@ -6,8 +6,8 @@
|
||||
from .set_uart import number, parse_frame
|
||||
|
||||
TYPES = {0: 'BROADCAST', 1: 'DISCRETE', 2: 'ANALOG', 3: 'GAS',
|
||||
4: 'GAS_SLOT', 5: 'MODBUS_DISCRETE', 6: 'MODBUS_HOLDING', # Тип 0x4 теперь означает масочный слотный GAS, номера остальных Modbus-типов сохранены.
|
||||
7: 'MODBUS_INPUT', 8: 'ERROR', 9: 'BOOT_CONTROL', 10: 'BOOT_DATA_A',
|
||||
4: 'GAS_SLOT', 5: 'MODBUS', # Единый Modbus занимает 0x5, прежние коды 0x6 и 0x7 освобождены.
|
||||
8: 'ERROR', 9: 'BOOT_CONTROL', 10: 'BOOT_DATA_A', # Остальные сервисы сохраняют числовые коды.
|
||||
11: 'BOOT_DATA_B', 12: 'BOOT_STATUS', 13: 'BOOT_DISCOVERY', 15: 'PULSE'}
|
||||
BOOT = dict(enumerate(('IDENTIFY ENTER_BOOT BEGIN_IMAGE BEGIN_COMPAT ERASE VERIFY '
|
||||
'COMMIT CONFIRM REBOOT ABORT QUERY_PROGRESS').split(), 1))
|
||||
@@ -49,8 +49,14 @@ def legacy(ident, data, profile='protocan'):
|
||||
result['mask'] = values[0] if values else None # Пустой запрос чтения не содержит фиктивной маски.
|
||||
result['slot_words'] = [(index, values[index]) for index in range(1, 4) if values and values[0] & (1 << index)] # Публикуем только выбранные или достоверные значения, без служебного Word0.
|
||||
text += ' slot=%04X' % body + (' READ' if not values else ' mask=%04X' % values[0]) # В логе ясно различаются адрес и маска частичной записи.
|
||||
elif 5 <= msg <= 7: # Диапазон Modbus больше не включает бывший Coil 0x4.
|
||||
text += ' address=%03X count=%d' % (body >> 4, body & 15)
|
||||
elif msg == 5: # Modbus использует один тип сообщения и поле функции внутри Body.
|
||||
from protocan.protocan import decode # Один подробный декодер проверяет длину, диапазон адресов и битовые маски.
|
||||
decoded = decode(ident, bytes(data)) # Передаём исходный payload без повторной реализации протокольных проверок.
|
||||
if decoded.warnings: # Некорректные значения должны быть видны вызывающему анализатору.
|
||||
raise ValueError('; '.join(decoded.warnings)) # Сохраняем подробные сообщения общей реализации.
|
||||
result['address'], result['count'], result['function'] = body >> 4, (body & 3) + 1, ((body >> 2) & 3) + 1 # Внешний результат содержит физические значения полей 1…4.
|
||||
result['registers'] = decoded.registers # Для Coil/Discrete публикуются отдельные биты, для Holding/Input — 16-битные слова.
|
||||
text += ' FC%d address=%03X count=%d' % (result['function'], result['address'], result['count']) # Журнал явно различает четыре банка единого Modbus.
|
||||
elif msg == 8:
|
||||
text += ' info=%02X code=%02X' % (body >> 8, body & 255)
|
||||
elif msg in (9, 12):
|
||||
|
||||
Reference in New Issue
Block a user