Descrição:
Possuo um driver Modbus Mestre (protocolo Modbus-TCP) conectado em um conversor Ethernet/RS485, e dentro desta rede RS-485 há dois dispositivos escravos (protocolo Modbus-RTU).
Eventualmente determinados tags apresentam falha ou TIMEOUT, e o problema só acontece quando tentamos comunicar com os dois escravos simultaneamente.
Solução:
Em muitos casos, o conversor Ethernet/RS485 ou Serial/RS485, necessita de um “delay” entre as transações TX/RX para conseguir comunicar com múltiplos escravos da rede RS-485, e isso por padrão não é feito.
A opção “Inter-frame delay” da aba Serial, que define uma espera entre pacotes enviados ou recebidos pelo IOKit em milésimos de segundo (1000 = 1 segundo) poderia introduzir um delay entre cada transação TX/RX, no entanto, essa opção ainda não é suportada pela camada Ethernet do IOKit, somente via camada Serial. Portanto esta solução seria válida apenas para uso de um conversor RS485 para Serial.
Nos casos de conversor RS485 para Serial ou conversor RS485 para Ethernet, pode-se utilizar um parâmetro do driver Modbus (oculto no dialog de propriedades) para adicionar um delay entre as transações TX/RX durante a troca de ID dos escravos.
Para configurar esta opção, uma sugestão seria iniciar o driver em modo Offline (selecionar a opção “Start driver OFFLINE” na aba Setup ), e inserir o seguinte script no evento AfterStart do driver:
Sub Modbus1_AfterStart() ' Habilita a funcao Swap Address Delay Write -1, 0, 0, 3, Array("ModiconModbus.UseSwapAddressDelay", 1) ' Configura o atraso (por exemplo, 300 milisegundos) Write -1, 0, 0, 3, Array("ModiconModbus.SwapAddressDelay", 300) 'Online Write -1,0,0,4,1 End Sub
A dica atendeu 100% minha necessidade e o problema foi solucionado imediatamente com a configuração do “Inter-frame Delay”.
Agradeço muito o esclarecimento. Parabéns Elipse, parabéns equipe de suporte.