/// <summary>解析消息</summary> /// <param name="pk"></param> /// <returns></returns> public static ModbusMessage Read(Packet pk, Boolean reply = false) { var msg = new ModbusMessage { Reply = reply }; if (msg.Read(pk.GetStream(), null)) { return(msg); } return(null); }
public ModbusMessage CreateReply() { if (Reply) { throw new InvalidOperationException(); } var msg = new ModbusMessage { Reply = true, TransactionId = TransactionId, ProtocolId = ProtocolId, Host = Host, Code = Code, }; return(msg); }
/// <summary>发送两字节命令,并接收返回</summary> /// <param name="host"></param> /// <param name="code"></param> /// <param name="address"></param> /// <param name="value"></param> /// <returns></returns> public override Byte[] SendCommand(Byte host, FunctionCodes code, UInt16 address, Object value) { Open(); var tid = Interlocked.Increment(ref _transactionId); var msg = new ModbusMessage { TransactionId = (UInt16)tid, ProtocolId = ProtocolId, Host = host, Code = code, Address = address, //Count = value }; if (value is UInt16 v) { msg.Count = v; } else if (value is Packet pk) { msg.Payload = pk; } else if (value is Byte[] buf) { msg.Payload = buf; } WriteLog("=> {0}", msg); var cmd = msg.ToPacket().ToArray(); { using var span = Tracer?.NewSpan("modbus:SendCommand", cmd.ToHex()); _stream.Write(cmd, 0, cmd.Length); Thread.Sleep(10); } using var span2 = Tracer?.NewSpan("modbus:ReceiveCommand"); try { var buf = new Byte[BufferSize]; var c = _stream.Read(buf, 0, buf.Length); buf = buf.ReadBytes(0, c); if (span2 != null) { span2.Tag = buf.ToHex(); } var rs = ModbusMessage.Read(buf, true); if (rs == null) { return(null); } WriteLog("<= {0}", rs); return(rs.Payload?.ToArray()); } catch (Exception ex) { span2?.SetError(ex, null); if (ex is TimeoutException) { return(null); } throw; } }