<< Clique para Mostrar o Sumário >>
Leitura do Código da Última Exceção |
Conforme já mencionado neste Manual, os Tags Especiais para leitura do código da última exceção são utilizados para ler o último código de exceção enviado por um determinado equipamento escravo.
Tais códigos são armazenados automaticamente por este Driver em registradores internos, que podem ser acessados por meio deste Tag. Além disto, a cada comunicação bem sucedida com determinado equipamento em que nenhuma exceção é retornada, este Driver zera automaticamente o registrador associado.
Os códigos de exceção são usados pelo dispositivo escravo (CLP) para informar uma falha ao executar uma determinada função. Os dispositivos ou equipamentos escravos não retornam exceções no caso de falhas de comunicação, situação em que estes simplesmente não respondem. Os códigos de exceção são retornados pelos escravos em situações em que a solicitação do mestre, no caso deste Driver, foi recebida com sucesso, porém não pôde ser executada por algum motivo, como por exemplo a tentativa de ler ou escrever em um registrador inexistente. Neste caso, o código de exceção retornado indica o tipo de erro ocorrido, ou seja, o motivo pelo qual a requisição deste Driver, embora recebida corretamente, não pôde ser executada.
A especificação do protocolo Modbus define nove códigos de exceção. A lista de exceções padrão do protocolo pode ser consultada no tópico Lista de Exceções Padrão do Protocolo Modbus. Além destes códigos, alguns fabricantes definem códigos adicionais, específicos dos equipamentos. Tais códigos devem estar documentados no manual do equipamento. Caso não estejam documentados, deve-se consultar o suporte do fabricante.
•Dispositivo: Valor numérico do Id do equipamento (Slave Id) seguido de dois pontos, como por exemplo "1:", "2:", "3:", e assim por diante
•Item: "LastExceptionCode"
•B1: Endereço do dispositivo escravo (Slave Id)
•B2: 9999
•B3: Não usado, deve ser deixado em 0 (zero)
•B4: Não usado, deve ser deixado em 0 (zero)
Valores dos Elementos de Bloco retornados:
•Elemento 1 (índice 0): Código da exceção retornada pelo equipamento. Para mais informações, consulte o tópico Lista de Exceções Padrão do Protocolo Modbus
•Elemento 2 (índice 1): Parâmetro N2/B2 do Tag de Comunicação que gerou a exceção
•Elemento 3 (índice 2): Parâmetro N3/B3 do Tag de Comunicação que gerou a exceção
•Elemento 4 (índice 3): Parâmetro N4/B4 do Tag de Comunicação que gerou a exceção
•Elemento 5 (índice 4): Parâmetro Size do Tag de Comunicação que gerou a exceção
•Elemento 6 (índice 5): Parâmetro Dispositivo do Tag de Comunicação que gerou a exceção
•Elemento 7 (índice 6): Parâmetro Item do Tag de Comunicação que gerou a exceção
A utilização mais comum deste Tag durante o scan normal dos Tags de funções é através de um evento OnRead do Tag de exceção. Neste caso, o script deve antes de tudo rejeitar valores nulos, pois estes indicam o não recebimento de exceções. Em seguida, pode-se tratar a exceção executando os procedimentos adequados, conforme o código recebido. É uma boa prática zerar o registrador de exceção ao sair do script, de forma a indicar que a exceção já foi tratada. O exemplo a seguir está escrito em Elipse Basic (Elipse SCADA).
// Evento OnRead do Tag TagExc
// Obs.: Para este exemplo, considere TagExc
// com leitura e escrita automática habilitadas
If TagExc == 0
Return
EndIf
If TagExc == 1
... // Trata a exceção 1
ElseIf TagExc == 2
... // Trata a exceção 2
Else
... // Trata as demais exceções
EndIf
TagExc = 0 // Zera o registrador de exceções
O exemplo a seguir está escrito em VBScript (E3 ou Elipse Power).
' Evento OnRead do Tag TagExc
' Obs.: Para este exemplo, considere TagExc
' com leitura e escrita automática habilitadas
Sub TagExc_OnRead()
If Value = 0 Then
Exit Sub
End If
If Value = 1 Then
... ' Trata a exceção 1
ElseIf Value = 2 Then
... ' Trata a exceção 2
Else
... ' Trata as demais exceções
End If
Value = 0 ' Zera o registrador de exceções
End Sub
Já nas operações de escrita por script, em que é preciso testar o retorno de exceções logo após o envio do comando, deve-se primeiramente zerar o registrador de exceções. Isto evita que uma eventual exceção provocada pelo comando de escrita seja confundida com outra pré-existente. Executa-se então a operação de escrita e testa-se o valor do Tag Especial, que deve retornar 0 (zero) caso nenhuma exceção tenha sido recebida. Caso retorne um valor diferente de 0 (zero), pode-se então tratar apropriadamente a exceção recebida. O exemplo a seguir está escrito em Elipse Basic (Elipse SCADA).
// Obs: Para este exemplo, considere TagExc
// com leitura e escrita automática habilitadas
// e TagVal com escrita automática desabilitada
TagExc = 0 // Zera o registrador de exceções
TagVal.WriteEx(10) // Escreve o valor 10
If TagExc <> 0
... // Trata a exceção
EndIf
O exemplo a seguir está escrito em VBScript (E3 ou Elipse Power).
' Obs: Para este exemplo, considere TagExc
' com leitura e escrita automática habilitadas
' e TagVal com escrita automática desabilitada
' Zera o registrador de exceções
Application.GetObject("Tags.TagExc").Value = 0
' Escreve o valor 10
Application.GetObject("Tags.TagVal").WriteEx(10)
If Application.GetObject("Tags.TagExc").Value <> 0 Then
... ' Trata a exceção
End If
NOTA |
Este Tag Especial retorna, além do código da exceção retornado no Elemento 0 (zero), também os parâmetros do Tag cuja comunicação provocou a exceção. Caso estas informações não sejam necessárias, pode-se perfeitamente ler o mesmo registro através de um Tag simples, ou Tag PLC no Elipse SCADA, sem a necessidade de usar Tags Bloco. Neste caso, os procedimentos recomendados permanecem os mesmos. |