Search code examples
pythoninterruptmodbus

Interrupt function in python


I'm using modbus protocol to communicate with my program. When slave gets signal from master on register 1 he starts function

def main():

    #Create the server
    server = modbus_rtu.RtuServer(serial.Serial(PORT))
    server.start()

    slave_1 = server.add_slave(1)
    slave_1.add_block('0', cst.HOLDING_REGISTERS, 0, 2)
    slave_1.set_values('0', 0, 0)         #set value on the begining
    slave_1.set_values('0', 1, 0)         #set value on the begining

    while True:

        register_1 = slave_1.get_values('0', 0, 1)
        register_2 = slave_1.get_values('0', 1, 1)


        if register_1[0] == 1:

            time.sleep(3)
            slave_1.set_values('0', 0, 1)
            time.sleep(3)
            slave_1.set_values('0', 0, 0)

I want stop this function when I change state on register 2 for few seconds, after this time it should come back to place when it was stopped. It should be immediately, so I can not check this is normal "if". It should by similar like interrupt in arduino.

Question: How can I create this interrupt?


Solution

  • Unfortunatelly I don't know any similar python function like interrupt in arduino.

    If you want to stop this program use:

        if register_1[0] == 1:
    
            for i in range(300): #for 300ms
                if register_2[0] == 1:
                    __STOP_PROGRAM__
                time.sleep(0.1) #sleep 1ms
            slave_1.set_values('0', 0, 1)
            for i in range(300): #for 300ms
                if register_2[0] == 1:
                    __STOP_PROGRAM__
                time.sleep(0.1) #sleep 1ms
            slave_1.set_values('0', 0, 0)
    

    It's not immediate, but if you need more exact, you can increase a value in range() and decrease a value in time.sleep()