1.0.0 • Published 1 year ago

@libs-scripts-mep/modbus-scheduler v1.0.0

Weekly downloads
-
License
ISC
Repository
-
Last release
1 year ago

Modbus Scheduler

Biblioteca que permite gerenciar dispositivos modbus em rede

Instalando

Abra o terminal, e na pasta raíz do script, execute:

npm i @libs-scripts-mep/modbus-scheduler

Desinstalando

Abra o terminal, e na pasta raíz do script, execute:

npm uninstall @libs-scripts-mep/modbus-scheduler

Atualizando

Abra o terminal, e na pasta raíz do script, execute:

npm update @libs-scripts-mep/modbus-scheduler

Como utilizar

  1. Realize a importação:

    import ModbusScheduler from "./module_path/modbus-scheduler.js"
  2. Inicialize uma instância do ModbusScheduler:

    const scheduler = new ModbusScheduler(9600, "scheduler")
  3. Estabeleça a conexão com algum dos dispositivos:

    async connectScheduler() {
        while (!Socket.IO.connected) { await SerialUtil.Delay(1000); console.log(`Master: Aguardando conexão com server...`) }
    
        const discover = await scheduler.portDiscover({ 
            request: "AA2B0E0401973F", 
            regex: new RegExp("AA2B0E0481000001010D4A49472D3030394D31504C3100F5A3"), 
            maxTries: 20 
        }, { manufacturer: "FTDI" })
    
        discover.success
            ? Log.console(discover.msg, scheduler.Log.success)
            : Log.warn(discover.msg, scheduler.Log.error)
    
        if (!discover.success) { return { success: false, msg: discover.msg } }
    
        const create = await scheduler.create()
        if (!create.success) { return create }
    
        const setSlaveAddr = await scheduler.setNodeAddress(170)
        return setSlaveAddr
    }
    
    await this.connectScheduler()
  4. Adicione um dispositivo na rede (instruções mais detalhadas via JSDoc):

    scheduler.addDevice(MbiControl, "mbi", 170, 0)

    ⚠️ ATENÇÃO: não é possível adicionar dispositivos com baudrate ou paridade diferentes. ⚠️

  5. A partir daí, o gerenciamento dos dispositivos fica abstraído no ModbusScheduler, portanto basta realizar as requisições:

    await MbiControl.modbus.readHoldingRegisters(0x2500, 2)
    await Controller.modbus.writeSingleRegister(0x5000, 100)

Funcionamento

Cadastro de dispositivos

Ao adicionar um dispositivo na rede, é feito um override da propriedade modbus dele, que deixa de ser uma instância da Modbus e passa a ser uma instância da ModbusReqList. Desta forma, a biblioteca original do dispositivo não é afetada, pois ainda possuirá os métodos de leitura e escrita.

⚠️ ATENÇÃO: a biblioteca original perderá métodos como freeSlave e setNodeAddress, pois eles agora pertencem ao ModbusScheduler. ⚠️

Gerenciamento das requisições

Enquanto houverem requisições, o scheduler irá iterar sobre as filas, respeitando um ciclo do round-robin, a prioridade e envelhecimento de requisições.

Round-robin

A propriedade roundRobinCycle define o tempo que cada fila recebe para executar suas requisições. A fila enviará suas requisições até o ciclo acabar ou uma requisição mais prioritária ser inserida.

Prioridade

A prioridade de cada fila é definida durante o cadastro do dispositivo. Quanto maior o número, maior a prioridade. A fila não enviará as suas requisições enquanto houver requisições com maior prioridade em outras filas.

Envelhecimento de requisições

A implementação de prioridade permite que dispositivos mais importantes tenham suas requisições atendidas mais rápido. No entanto, quando o dispositivo mais prioritário envia muitas requisições, isto pode fazer com que as filas dos dispositivos menos prioritários nunca seja atendida, gerando o problema de 'starving'. Para contornar este problema, é possível configurar um tempo de 'aging' (envelhecimento) no cadastro do dispositivo. A cada vez que este tempo é atingido, a prioridade do dispositivo será incrementada, permitindo que ele seja atendido em algum momento. Após ser atendido, a prioridade é resetada para o valor original.

1.0.0

1 year ago