Beispiel #1
0
        private void SocketAsyncCallBack(IAsyncResult ar)
        {
            if (ar.AsyncState is AppSession session)
            {
                try
                {
                    int receiveCount = session.WorkSocket.EndReceive(ar);

                    ModbusTcpMessage       mdMessage = new ModbusTcpMessage( );
                    OperateResult <byte[]> read1     = ReceiveByMessage(session.WorkSocket, 5000, mdMessage);
                    if (!read1.IsSuccess)
                    {
                        LogNet?.WriteDebug(ToString( ), string.Format(StringResources.Language.ClientOfflineInfo, session.IpEndPoint));
                        RemoveClient(session);
                        return;
                    }
                    ;

                    ushort id   = (ushort)(read1.Content[0] * 256 + read1.Content[1]);
                    byte[] back = ModbusInfo.PackCommandToTcp(ReadFromModbusCore(SoftBasic.BytesArrayRemoveBegin(read1.Content, 6)), id);
                    if (back != null)
                    {
                        session.WorkSocket.Send(back);
                    }
                    else
                    {
                        session.WorkSocket.Close( );
                        RemoveClient(session);
                        return;
                    }

                    RaiseDataReceived(read1.Content);
                    session.WorkSocket.BeginReceive(new byte[0], 0, 0, SocketFlags.None, new AsyncCallback(SocketAsyncCallBack), session);
                }
                catch
                {
                    // 关闭连接,记录日志
                    session.WorkSocket?.Close( );
                    LogNet?.WriteDebug(ToString( ), string.Format(StringResources.Language.ClientOfflineInfo, session.IpEndPoint));
                    RemoveClient(session);
                    return;
                }
            }
        }
Beispiel #2
0
        private void OnReceived(Object sender, ReceivedEventArgs e)
        {
            var session = sender as NetSession;

            if (session == null)
            {
                return;
            }

            var msg = ModbusTcpMessage.Read(e.Packet);

            if (msg == null)
            {
                return;
            }

            session.Log?.Info("<= {0}", msg);

            var rs = msg.CreateReply();

            switch (msg.Code)
            {
            case FunctionCodes.ReadCoil:
            case FunctionCodes.ReadDiscrete:
            {
                // 连续地址
                var regCount = msg.Payload.ReadBytes(0, 2).ToUInt16(0, false);
                var count    = (Int32)Math.Ceiling(regCount / 8.0);
                var addr     = msg.Address - _data[0].Address;
                if (addr >= 0 && addr + count <= _data.Count)
                {
                    rs.Payload = _data.Skip(addr).Take(count).SelectMany(e => e.GetData()).ToArray();
                }
            }
            break;

            case FunctionCodes.ReadRegister:
            case FunctionCodes.ReadInput:
            {
                // 连续地址
                var regCount = msg.Payload.ReadBytes(0, 2).ToUInt16(0, false);
                var addr     = msg.Address - _data[0].Address;
                if (addr >= 0 && addr + regCount <= _data.Count)
                {
                    rs.Payload = _data.Skip(addr).Take(regCount).SelectMany(e => e.GetData()).ToArray();
                }
            }
            break;

            case FunctionCodes.WriteCoil:
                break;

            case FunctionCodes.WriteRegister:
            {
                // 连续地址
                var regCount = 0;
                for (var i = 0; i < 256 && i + 1 < msg.Payload.Total; i += 2)
                {
                    var value = msg.Payload.ReadBytes(i, 2).ToUInt16(0, false);
                    var addr  = msg.Address - _data[0].Address;
                    if (addr >= 0 && addr < _data.Count)
                    {
                        var ru = _data[addr];
                        ru.Value = value;
                        regCount++;
                    }
                }
                Invoke(() => { dgv.Refresh(); });
                {
                    var addr = msg.Address - _data[0].Address;
                    rs.Payload = _data.Skip(addr).Take(regCount).SelectMany(e => e.GetData()).ToArray();
                }
            }
            break;

            case FunctionCodes.WriteCoils:
                break;

            case FunctionCodes.WriteRegisters:
                break;

            default:
                break;
            }

            session.Log?.Info("=> {0}", rs);

            session.Send(rs.ToPacket());
        }