Я новичок в python, и у меня проблема с кодом, позволяющим извлекать значение регистра и номер регистра. Этот код работает для всех функций Modbus, кроме fun c 6 и 5. В этих функциях нет «startAddr» и «registerVal», но registerAddr и registerValue см. Ниже:
class ModbusPDU03ReadHoldingRegistersRequest(Packet):
name = "Read Holding Registers"
fields_desc = [XByteField("funcCode", 0x03),
XShortField("startAddr", 0x0000),
XShortField("quantity", 0x0001)]
def extract_padding(self, s):
return b"", None
class ModbusPDU03ReadHoldingRegistersResponse(Packet):
name = "Read Holding Registers Response"
fields_desc = [XByteField("funcCode", 0x03),
BitFieldLenField("byteCount", None, 8, count_of="registerVal", adjust=lambda pkt, x: x * 2), # noqa: E501
FieldListField("registerVal", [0x0000], ShortField("", 0x0000), # noqa: E501
count_from=lambda pkt: pkt.byteCount)]
class ModbusPDU06WriteSingleRegisterRequest(Packet):
name = "Write Single Register"
fields_desc = [XByteField("funcCode", 0x06),
XShortField("registerAddr", 0x0000),
XShortField("registerValue", 0x0000)]
def extract_padding(self, s):
return b"", None
class ModbusPDU06WriteSingleRegisterResponse(Packet):
name = "Write Single Register Response"
fields_desc = [XByteField("funcCode", 0x06),
XShortField("registerAddr", 0x0000),
XShortField("registerValue", 0x0000)]
, поэтому Это нормально, что для удовольствия c 6 и 5 метрики для значений и чисел регистров не могут быть вычислены. Требуется другое условие:
, если funCode отличается от 0x06 и 0x05, сделайте это:
def reg_no_list(s):
r = []
for p in s:
if p.haslayer('ModbusADURequest'):
try:
r.append(p['ModbusADURequest'][1].startAddr)
except AttributeError:
pass
return r
def reg_val_list(s):
v = []
for p in s:
if p.haslayer('ModbusADUResponse'):
try:
v += p['ModbusADUResponse'][1].registerVal
except AttributeError:
pass
return v
else
def reg_no_list(s):
r = []
for p in s:
if p.haslayer('ModbusADURequest'):
try:
r.append(p['ModbusADURequest'][1]. registerAddr)
except AttributeError:
pass
return r
def reg_val_list(s):
v = []
for p in s:
if p.haslayer('ModbusADUResponse'):
try:
v += p['ModbusADUResponse'][1]. registerValue
except AttributeError:
pass
return v
Я не знаю, как добавить это условие. Любая помощь, пожалуйста?