import asyncio
from pymodbus.server import StartTcpServer, StartAsyncTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock 
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
import random

tasks = []
salve_num = 64

class LogSlaveContext(ModbusSlaveContext):
    def setValues(self, fc_as_hex, address, values):
        print(f"Set {address} to {values}")
        super().setValues(fc_as_hex, address, values)

async def start_slave(slave_id):
    # 生成随机寄存器初始值  
    # random.seed(a=None, version=2)
    # values = [random.randint(0,100) for i in range(2000)]
    values = [i for i in range(slave_id, slave_id + 2000)]

    # 创建从机上下文
    store = LogSlaveContext()

    # 启动服务器
    context = ModbusServerContext(slaves=store, single=True)
    context[0].setValues(0x03, 0, values)
    server = await StartAsyncTcpServer(context=context, address=("0.0.0.0", 503 + slave_id))
    print(server.params.source_address)
    return server

for i in range(salve_num):
    tasks.append(start_slave(i))

asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
loop.run_forever()