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; } } }
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()); }