/// <summary> /// Constructor which determines the Master ip-address and the Master Port. /// </summary> /// <param name="ipAddress">IP-Address of the Master device</param> /// <param name="port">Listening port of the Master device (should be 502)</param> public ModbusClient(ModbusChannel channel) { this.modbusChannel = channel; }
private void RunReceive(ModbusChannel channel) { lock (responseWaitHandles) { if (!isReceiving) { isReceiving = true; try { var readBuffer = new ResponseBuffer(channel); while (responseWaitHandles.Count > 0) { if (errorBuffer.Count >= 256) { RaiseUnrecognized(channel, errorBuffer.ToArray()); errorBuffer.Clear(); } readBuffer.Read(2, 0); ushort transactionID = (ushort)((readBuffer[0] << 8) | readBuffer[1]); if (!responseWaitHandles.TryGetValue(transactionID, out var responseWaitHandle)) { errorBuffer.AddRange(readBuffer); readBuffer.Clear(); continue; } readBuffer.Read(2, responseWaitHandle.Timeout); if (readBuffer[2] != 0 || readBuffer[3] != 0) { errorBuffer.AddRange(readBuffer); readBuffer.Clear(); responseWaitHandle.Response = new ModbusCommErrorResponse(ModbusCommErrorCode.ModbusTcpSymbolError, errorBuffer, responseWaitHandle.Request); continue; } var result = base.DeserializeResponse(readBuffer, responseWaitHandle.Request, responseWaitHandle.Timeout); if (result is ModbusCommErrorResponse responseCommErrorMessage) { errorBuffer.AddRange(readBuffer.Take(4)); readBuffer.RemoveRange(0, 4); responseWaitHandle.Response = result; continue; } if (readBuffer.Count - 6 != (ushort)((readBuffer[4] << 8) | readBuffer[5])) { errorBuffer.AddRange(readBuffer.Take(4)); readBuffer.RemoveRange(0, 4); responseWaitHandle.Response = new ModbusCommErrorResponse(ModbusCommErrorCode.ResponseTcpLengthDoNotMatch, readBuffer, responseWaitHandle.Request); continue; } if (errorBuffer.Count > 0) { RaiseUnrecognized(channel, errorBuffer.ToArray()); errorBuffer.Clear(); } responseWaitHandle.ResponseBuffer.AddRange(readBuffer); readBuffer.Clear(); responseWaitHandle.Response = result; responseWaitHandle.Set(); this.responseWaitHandles.Remove(transactionID); } } catch { } isReceiving = false; } } }
internal RequestBuffer(ModbusSlaveService modbusSlave, ModbusChannel channel) : base(channel) { ModbusSlave = modbusSlave; }
internal ResponseBuffer(ModbusChannel channel) : base(channel) { }
internal ChannelBuffer(ModbusChannel channel) { Channel = channel; }