Я пытаюсь написать мастер-программу 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 три раза, указывая на три попытки:
Чтобы исправить это, я попытался использовать точки останова для диагностики проблемы, и похоже, что 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.Любая помощь будет высоко ценится.