Как избавиться от LoopingCall в коде Python - PullRequest
0 голосов
/ 22 мая 2018

Я использую Modbus пример кода сервера из библиотеки pymodbus для создания сервера пересылки данных (чтение некоторых последовательных данных, форматирование и последующее назначение данных в регистры Modbus для чтения мастером Modbus).У меня проблема с последовательной задержкой (чтение с 6 разных устройств, каждое устройство имеет 5-секундную задержку, но это случайно, они не отправляют данные одновременно).В этом примере они используют LoopingCall, что плохо для моего времени.Как мне от него избавиться, чтобы я мог сам вызывать функцию?

Я пытался просто избавиться от:

time = 2 # Update delay
loop = LoopingCall(f=updating_writer, a=(context,))
loop.start(time, now=False)

И просто позвонил:

updating_writer()

Но, очевидно, мне не хватает некоторых аргументов:

a=(context,)

Часть моего кода:

def data_decoder6():
    ser_read_JB1 = ser_JB6.read(386)
    if len(ser_read_JB1) != 0:
        # convert ascii to hex
        aTOh_JB1 = "".join("{:02x}".format(c) for c in ser_read_JB1)
        # convert to string
        iTOs_JB1 = str(aTOh_JB1)
        lokacija = [258,422,426,414,402,406,266,274,270,558,
                    530,534,538,322,326,330,334,338,342,346,
                    350,354,358,362,366,370,374,378,382,386,
                    390,394,398
                        ]
        values_JB1 = [0 for d in range(33)] 
        values_2_JB6 = [0 for e in range(33)]
        for x in range(0, 33):
            values_JB1[x] = (iTOs_JB1[lokacija[x]] + iTOs_JB1[lokacija[x]+1] 
                           + iTOs_JB1[lokacija[x]+2] + iTOs_JB1[lokacija[x]+3])
            #values1 = values.replace('"', '') 
            values_2_JB6[x] = int(values_JB1[x], 16)
            #values.append( 2009 )
        return values_2_JB6
    else:
    values_2_JB6 = [0 for e in range(33)]
    return values_2_JB6

def updating_writer(a):
    allValues = [0 for d in range(198)]
    allValues = (data_decoder1() + data_decoder2() + data_decoder3() + 
    data_decoder4() + data_decoder5() + data_decoder6())
    # modbus part
    log.debug("updating the context")
        context  = a[0]
        register = 0x03
        slave_id = 0x01
        address  = 0x01
        values   = context[slave_id].getValues(register, address, count=198)
        values   = allValues
        log.debug("new values: " + str(values))
        context[slave_id].setValues(register, address, values)

def run_updating_server():
    store = ModbusSlaveContext(
        di = ModbusSequentialDataBlock(0, [0]*1),
        co = ModbusSequentialDataBlock(0, [0]*1),
        hr = ModbusSequentialDataBlock(0, [0]*198),
        ir = ModbusSequentialDataBlock(0, [0]*1))

    context = ModbusServerContext(slaves=store, single=True)
    identity = ModbusDeviceIdentification()
    identity.VendorName  = 'pymodbus'
    identity.ProductCode = 'PM'
    identity.VendorUrl   = 'http://github.com/bashwork/pymodbus/'
    identity.ProductName = 'pymodbus Server'
    identity.ModelName   = 'pymodbus Server'
    identity.MajorMinorRevision = '1.0'

    time = 2 # Update delay
    loop = LoopingCall(f=updating_writer, a=(context,))
    loop.start(time, now=False)
    StartTcpServer(context, identity=identity, address=("10.10.10.253", 502))

run_updating_server()

1 Ответ

0 голосов
/ 22 мая 2018

Этот код

loop = LoopingCall(f=updating_writer, a=(context,))
loop.start(time, now=False)

вызывает

updating_writer(context)

каждые time секунд (без немедленного вызова на вызов loop.start).

Поэтому, если вы хотите избавиться от LoopingCall, вы можете заменить его эквивалентными вызовами на updating_writer(context), запланированными по вашему усмотрению.

...