Example #1
0
        private async Task HandleRequestAsync()
        {
            while (true)
            {
#if ModBusDebug
                Debug.WriteLine($"Begin reading header from Master at IP: {EndPoint}");
#endif
                int readBytes = await Stream.ReadAsync(_mbapHeader, 0, 6).ConfigureAwait(false);

                if (readBytes == 0)
                {
#if ModBusDebug
                    Debug.WriteLine($"0 bytes read, Master at {EndPoint} has closed Socket connection.");
#endif
                    ModbusMasterTcpConnectionClosed?.Invoke(this, new TcpConnectionEventArgs(EndPoint));
                    return;
                }

                ushort frameLength = (ushort)IPAddress.HostToNetworkOrder(BitConverter.ToInt16(_mbapHeader, 4));
#if ModBusDebug
                Debug.WriteLine($"Master at {EndPoint} sent header: \"{string.Join(", ", _mbapHeader)}\" with {frameLength} bytes in PDU");
#endif

                _messageFrame = new byte[frameLength];
                readBytes     = await Stream.ReadAsync(_messageFrame, 0, frameLength).ConfigureAwait(false);

                if (readBytes == 0)
                {
#if ModBusDebug
                    Debug.WriteLine($"0 bytes read, Master at {EndPoint} has closed Socket connection.");
#endif
                    ModbusMasterTcpConnectionClosed?.Invoke(this, new TcpConnectionEventArgs(EndPoint));
                    return;
                }
#if ModBusDebug
                Debug.WriteLine($"Read frame from Master at {EndPoint} completed {readBytes} bytes");
#endif
                byte[] frame = _mbapHeader.Concat(_messageFrame).ToArray();
#if ModBusDebug
                Debug.WriteLine($"RX from Master at {EndPoint}: {string.Join(", ", frame)}");
#endif

                var request = ModbusMessageFactory.CreateModbusRequest(_messageFrame);
                request.TransactionId = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(frame, 0));

                // perform action and build response
                IModbusMessage response = _slave.ApplyRequest(request);
                response.TransactionId = request.TransactionId;

                // write response
                byte[] responseFrame = Transport.BuildMessageFrame(response);
#if ModBusDebug
                Debug.WriteLine($"TX to Master at {EndPoint}: {string.Join(", ", responseFrame)}");
#endif
                await Stream.WriteAsync(responseFrame, 0, responseFrame.Length).ConfigureAwait(false);
            }
        }
Example #2
0
        internal void ReadFrameCompleted(IAsyncResult ar)
        {
            CatchExceptionAndRemoveMasterEndPoint(() =>
            {
                _log.DebugFormat("Read Frame completed {0} bytes", Stream.EndRead(ar));
                byte[] frame = _mbapHeader.Concat(_messageFrame).ToArray();
                _log.InfoFormat("RX: {0}", frame.Join(", "));

                IModbusMessage request = ModbusMessageFactory.CreateModbusRequest(frame.Slice(6, frame.Length - 6).ToArray());
                request.TransactionId  = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(frame, 0));

                // perform action and build response
                IModbusMessage response = _slave.ApplyRequest(request);
                response.TransactionId  = request.TransactionId;

                // write response
                byte[] responseFrame = Transport.BuildMessageFrame(response);
                _log.InfoFormat("TX: {0}", responseFrame.Join(", "));
                Stream.BeginWrite(responseFrame, 0, responseFrame.Length, WriteCompleted, null);
            }, EndPoint);
        }
Example #3
0
            internal void ReadFrameCompleted(IAsyncResult ar)
            {
                _log.DebugFormat("Read Frame completed {0} bytes", _stream.EndRead(ar));
                byte[] frame = CollectionUtility.Concat(_mbapHeader, _messageFrame);
                _log.InfoFormat("RX: {0}", StringUtility.Join(", ", frame));

                IModbusMessage request = ModbusMessageFactory.CreateModbusRequest(CollectionUtility.Slice(frame, 6, frame.Length - 6));

                request.TransactionID = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(frame, 0));

                // TODO refactor
                ModbusTcpTransport transport = new ModbusTcpTransport();
                // perform action and build response
                IModbusMessage response = _slave.ApplyRequest(request);

                response.TransactionID = request.TransactionID;

                // write response
                byte[] responseFrame = transport.BuildMessageFrame(response);
                _log.InfoFormat("TX: {0}", StringUtility.Join(", ", responseFrame));
                _stream.BeginWrite(responseFrame, 0, responseFrame.Length, WriteCompleted, null);
            }