Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        public ModbusMessage CreateReply()
        {
            if (Reply)
            {
                throw new InvalidOperationException();
            }

            var msg = new ModbusMessage
            {
                Reply         = true,
                TransactionId = TransactionId,
                ProtocolId    = ProtocolId,
                Host          = Host,
                Code          = Code,
            };

            return(msg);
        }
Exemplo n.º 3
0
        /// <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;
            }
        }