@libs-scripts-mep/modbus-scheduler
v1.0.0
Published
Biblioteca para gerenciamento de dispositivos modbus em rede
Downloads
57
Readme
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
Realize a importação:
import ModbusScheduler from "./module_path/modbus-scheduler.js"
Inicialize uma instância do ModbusScheduler:
const scheduler = new ModbusScheduler(9600, "scheduler")
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()
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. ⚠️
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.