System.TimeoutException вызывается при попытке записи в регистры хранения с использованием NModbus - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь написать мастер-программу Modbus на C #, которая записывает значения в регистры хранения одного подчиненного устройства через последовательное соединение RTU.

void SerialTimerTick(object sender, EventArgs e) {
    _sp.WriteLine(inputText.ToString());

    slaveAddress = (byte)slaveAddressNumericUpDown.Value;
    startAddress = (ushort)startAddressNumericUpDown.Value;
    registerAddress = (ushort)registerNumericUpDown.Value;
    targetRegisterValue = (ushort)targetValueNumericUpDown.Value;

    modbusMaster.WriteSingleRegister(slaveAddress, registerAddress, targetRegisterValue);

    SerialTimer.Enabled = false;
    sendButton.Enabled = true;
}

Проблема заключается в том, чтокогда я пытаюсь отправить запрос на запись подчиненному, я получаю следующую ошибку:

System.TimeoutException: истекло время ожидания операции.

, что происходит послеПрограмма выводит эти числа на консоль отладки в SharpDevelop три раза, указывая на три попытки:

  • 254
  • 120
  • 128
  • 34
  • 32
  • 25

Чтобы исправить это, я попытался использовать точки останова для диагностики проблемы, и похоже, что NModbus ожидает какой-то ACKNOWLEDGEответ от ведомого устройства, чтобы подтвердить, что данные были отправлены правильно, только такой ответ не предоставляется.

Когда я смотрю на канал связи моего ведомого, я вижу, что что-то происходит конец раба, когда обаВедущие и ведомые приложения работают, и мой компьютер подключен к себе с помощью двух адаптеров USB-Serial:

Port COM 3 opened.
Port I/O buffers configured.
Port configured 256000,8,N,1
Timeouts configured (100ms/500ms)
Modem status : [CTS_][DSR_RING_]
RX: 0D 0A 0A 06 00 01
RX: 00 01 19 CA
RX: 01 06 00 01 00 01
RX: 19 CA
RX: 01 06 00 01 00 01

Вместо этого я ожидал, что первая попытка будет успешной, а регистр 40001 изменит свой.значение от нуля до единицы.Я попытался изменить версии NModbus, я попытался возиться с тайм-аутом и попытался установить параметры объекта IModbusMaster, а также попытался полностью удалить исключение, что, по-видимому, является единственным способом, которым я получил программуработать правильно, однако в моем случае это неприемлемое решение.

Единственное, что я до сих пор не пробовал, - это изменение используемого ведомого приложения, которое в настоящее время является бесплатным PLC Simulator, который написан на C ++, а не на C #.Это может быть частью проблемы, но я не уверен.

Я пользуюсь Modbus всего несколько недель и работаю с довольно старой версией библиотеки NModbus.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 29 сентября 2018

Я не использовал NModbus, но я написал свой собственный «стек» Modbus на C ++ и C #, поэтому этот ответ больше основан на моем опыте работы с Modbus, чем на том, как работает NModbus.

Должно бытьответ от команд Modbus EXCEPT при широковещании (адрес ведомого 0).Для кода Modbus должна быть нормальная операция отправки запроса и ожидания ответа.Если ответ не будет получен в течение определенного периода времени, я ожидаю ошибку тайм-аута.

Просмотр спецификаций Modbus;Функция записи с одним регистром должна иметь идентичный запрос и ответ ADU (в случае успеха).Звучит так, как будто вы пытаетесь записать ведомый адрес 1 в регистр 1 со значением 1. В этом случае оба ADU ответа на запрос должны быть "01 06 00 01 00 01 19 CA" ("19 CA" является правильным CRC для этогоPDU).Я вижу, что могут быть данные из запроса или ответа, но, кажется, что-то мешает:

RX: 0D 0A (NOT SURE WHAT THIS DATA IS FROM)
RX: 0A 06 00 01 00 01 19 CA (LOOKS CLOSE, BUT ADDRESS IS WRONG)
RX: 01 06 00 01 00 01 19 CA (LOOKS CORRECT)
RX: 01 06 00 01 00 01 (LOOKS CORRECT, BUT INCOMPLETE)

Просто для тестирования, попробуйте гораздо более медленную скорость передачи данных (9600) и используйте даже четность.Некоторые конвертеры USB-Serial имеют параметры драйвера, которые можно настроить.У вас включено согласование на обоих конвертерах (первое и последнее устройства отключены)?Есть ли способ настроить время ожидания ответа NModbus?

...