Server example with alive word and downtime period

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Modbus/TCP server with start/stop schedule

import argparse
import time
from pyModbusTCP.server import ModbusServer, DataBank
# need https://github.com/dbader/schedule
import schedule


# word @0 = second since 00:00 divide by 10 to avoid 16 bits overflow
def alive_word_job():
    DataBank.set_words(0, [int(time.time()) % (24*3600) // 10])


if __name__ == "__main__":
    # parse args
    parser = argparse.ArgumentParser()
    parser.add_argument("-H", "--host", type=str, default="localhost", help="Host")
    parser.add_argument("-p", "--port", type=int, default=502, help="TCP port")
    args = parser.parse_args()
    # init modbus server and start it
    server = ModbusServer(host=args.host, port=args.port, no_block=True)
    server.start()
    # init scheduler
    # schedule a daily downtime (from 18:00 to 06:00)
    schedule.every().day.at("18:00").do(server.stop)
    schedule.every().day.at("06:00").do(server.start)
    # update life word at @0
    schedule.every(10).seconds.do(alive_word_job)
    # main loop
    while True:
        schedule.run_pending()
        time.sleep(1)