Как добавить условие в функцию Modbus, записанную в python? - PullRequest
0 голосов
/ 31 марта 2020

Я новичок в 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 

Я не знаю, как добавить это условие. Любая помощь, пожалуйста?

...