2024-08-03 21:30:57 +02:00

54 lines
1.9 KiB
Python

import time
import traceback
from src.hardware import Hardware
from src.logic import loop
from src.util import parse_commandline_args, connect_modbus_client
from src.config import MAX_RECONNECTION_ATTEMPTS, INITIAL_BACKOFF_TIME
def main():
args = parse_commandline_args()
reconnection_attempts = 0
while True:
try:
client = connect_modbus_client(args)
reconnection_attempts = 0 # Reset attempts on successful connection
hardware = Hardware(client, args.slave_id)
while True:
start_time = time.time()
hardware.sync_hardware_state()
loop(hardware)
execution_time = time.time() - start_time
if execution_time > args.cycle_time:
print(f"Warning: Loop execution time ({execution_time:.4f}s) exceeded cycle time ({args.cycle_time:.4f}s)")
sleep_time = max(0, args.cycle_time - execution_time)
time.sleep(sleep_time)
except KeyboardInterrupt:
print("Stopped by user")
break
except ConnectionError as e:
print(f"Connection error: {e}")
break # Exit if we've already tried the maximum number of reconnection attempts
except Exception as e:
print(f"Error: {e}")
print(traceback.format_exc())
reconnection_attempts += 1
if reconnection_attempts >= MAX_RECONNECTION_ATTEMPTS:
print("Maximum reconnection attempts reached. Exiting.")
break
backoff_time = INITIAL_BACKOFF_TIME * (2 ** reconnection_attempts)
print(f"Attempting to reconnect in {backoff_time} seconds...")
time.sleep(backoff_time)
finally:
if 'client' in locals():
client.close()
if __name__ == "__main__":
main()