Обработка исключений в Modbus 2.0 в C# - PullRequest
0 голосов
/ 23 апреля 2020

Я работаю над web-api, в котором я использую Modbus библиотеку протоколов sontx . В документации упоминается.

Обработка исключений

Существует несколько случаев, когда ответ поврежден, ответ не получен (возможно, подчиненный не работает), .. В этих случаях будет выдано исключение, для обработки которого необходимо использовать оператор try-catch.

Существует три вида исключений: - EmptyResponsedException: ведомое устройство ничего не отвечает, кажется, что ведомое устройство не работает, соединение разорвано ... - MissingDataException: байты ответа меньше требуемого, например: длина требуемых байтов равна 11, но длина принятых байтов равна 9. - DataCorruptedException: контрольная сумма не пройдена, неверный идентификатор ведомого ответа, неверный код функции ответа ...

try {
var responseBytes = stream.RequestFunc3(0x11, 0x006B, 0x0003);
// handle your response bytes
}
catch(Exception e) {
if (e is DataCorruptedException) {
    BroadcastHandledExceptionEvent("checksum is failed", e);
}
else if (e is EmptyResponsedException) {
    BroadcastHandledExceptionEvent("request timeout", e);
}
else if (e is MissingDataException) {
    BroadcastHandledExceptionEvent("Missing response bytes", e);
}
else {
    throw e;
}
}

Когда я пытаюсь добавить этот фрагмент кода в мой код, я получаю нижеуказанную ошибку

Имя 'BroadcastHandledExceptionEvent' не существует в текущем контексте

enter image description here

Я пытаюсь найти решение но я ничего не получил

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Похоже, BroadcastHandledExceptionEvent - это произвольный метод в примере. Вы должны реализовать свою собственную обработку ошибок в зависимости от типа исключения.

0 голосов
/ 01 мая 2020

«BroadcastHandledExceptionEvent» - это просто пример имени метода, который используется в документации, чтобы продемонстрировать, как вы можете обрабатывать перехват типов исключений. Вы можете заменить его собственным методом, чтобы вывести сообщение об исключении в пользовательский интерфейс, записать его в журнал и т. Д. c ..

Например, используя то же имя метода (с функцией «широковещательной» передачи исключения). при необходимости):

class ModbusTest
{
    public event EventHandler<string> ModbusExceptionThrown;

    public void TestRead()
    {
        try
        {
            var responseBytes = stream.RequestFunc3(0x11, 0x006B, 0x0003);
            // handle your response bytes
        }
        catch (Exception e)
        {
            if (e is DataCorruptedException)
            {
                BroadcastHandledExceptionEvent("checksum is failed", e);
            }
            else if (e is EmptyResponsedException)
            {
                BroadcastHandledExceptionEvent("request timeout", e);
            }
            else if (e is MissingDataException)
            {
                BroadcastHandledExceptionEvent("Missing response bytes", e);
            }
            else
            {
                throw e;
            }
        }
    }

    // logs exception stacktrace to console and raises event with message string
    protected virtual void BroadcastHandledExceptionEvent(string Message, Exception Ex)
    {
        Console.WriteLine(Ex.StackTrace);
        EventHandler<string> handler = ModbusExceptionThrown;
        handler?.Invoke(this, Message);
    }
}

Теперь ваш родительский объект может прослушивать сообщение об исключении Modbus, или, если в этом нет необходимости, вы можете просто записать его в консоль, файл или что-то еще.

...