public ModbusMessage ReadWriteMultipleRegisters(short readStartingAddress, short readRegisterQuantity, short writeStartingAddress, short writeRegisterQuantity, short[] writeRegisterValues) { if (readRegisterQuantity > 0x7d) { throw new ArgumentOutOfRangeException("readRegisterQuantity", "Cannot be grater than 125"); } if (writeRegisterQuantity > 0x79) { throw new ArgumentOutOfRangeException("readRegisterQuantity", "Cannot be grater than 121"); } ModbusMessage result = new ModbusMessage() { FunctionCode = 0x17, StartingAddress = readStartingAddress, RegisterQuantity = readRegisterQuantity }; result.DataPoints.AddRange(BitConverter.GetBytes(writeStartingAddress)); result.DataPoints.AddRange(BitConverter.GetBytes(writeRegisterQuantity)); foreach (short register in writeRegisterValues) { result.DataPoints.AddRange(BitConverter.GetBytes(register)); } return(SendMessage(result)); }
private byte[] ToBytes(ModbusMessage msg) { List <byte> result = new List <byte>(); switch (transportEncoding) { case TransportEncoding.ASCII: result.AddRange(msg.ToAdu(true)); result.AddRange(System.Text.Encoding.ASCII.GetBytes(ModbusMessage.CalculateLrc(result.ToArray()).ToString("X4"))); result.AddRange(System.Text.Encoding.ASCII.GetBytes("\r\n")); break; case TransportEncoding.Binary: result.Add(UnitId); result.AddRange(msg.ToPdu()); result.AddRange(ModbusMessage.CalculateCrc16(result.ToArray())); //result.Insert(0, UnitId); break; case TransportEncoding.IpWithOutCrc: msg.TransactionId = NextTransactionId; msg.UnitId = UnitId; result.AddRange(msg.ToAdu()); break; default: case TransportEncoding.IpWithCrc: msg.TransactionId = NextTransactionId; msg.UnitId = UnitId; result.AddRange(msg.ToAdu()); result.AddRange(ModbusMessage.CalculateCrc16(result.ToArray())); break; } return(result.ToArray()); }
public ModbusMessage WriteMultipleRegisters(short startingAddress, short registerQuantity, short[] registerValues) { if (registerQuantity > 0x7b) { throw new ArgumentOutOfRangeException("registerQuantity", "Cannot be grater than 123"); } ModbusMessage result = new ModbusMessage() { FunctionCode = 0x10, StartingAddress = startingAddress, RegisterQuantity = registerQuantity }; foreach (short register in registerValues) { result.DataPoints.AddRange(BitConverter.GetBytes(register)); } return(SendMessage(result)); }
public ModbusMessage SendMessage(ModbusMessage msg) { return(SendMessage(msg, 0)); }
private ModbusMessage SendMessage(ModbusMessage msg, int retry) { if (retry > maxRetries) { throw new Exception("Not Responding"); } if (!Socket.Connected) { Socket.Connect(ipEndPoint); } Socket.SendTimeout = Socket.ReceiveTimeout = sendRecieveTimeout; requestLog.Add(msg); byte[] outBytes = ToBytes(msg); if (Socket.Available > 0) { int r = Socket.Receive(new byte[Socket.Available]); if (transportProtocol == ProtocolType.Tcp) { tcpRcvd += r; } else { udpRcvd += r; } } if (transportProtocol == ProtocolType.Udp) { Socket.Send(outBytes); } else { netStream.Write(outBytes, 0, outBytes.Length); } if (tcpRcvd == 0 && udpRcvd == 0) { if (transportProtocol == ProtocolType.Udp) { Socket.Send(outBytes); } else { netStream.Write(outBytes, 0, outBytes.Length); } } if (transportProtocol == ProtocolType.Tcp) { tcpSent += outBytes.Length; } else { udpSent += outBytes.Length; } byte[] buffer = new byte[256]; while (Socket.Available < 6) { System.Threading.Thread.Sleep(0); } int rcv = Socket.Receive(buffer); byte[] inBytes = new byte[rcv]; Array.Copy(buffer, 0, inBytes, 0, rcv); if (transportProtocol == ProtocolType.Tcp) { tcpRcvd += inBytes.Length; } else { udpRcvd += inBytes.Length; } ModbusMessage result = new ModbusMessage(inBytes); recieveLog.Add(result); return(result); }