Dreamine.PLC.Mitsubishi.MC 1.0.1
Dreamine.PLC.Mitsubishi.MC 산업 자동화 및 I/O 기능을 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport 클래스 참조sealed

더 자세히 ...

Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport에 대한 상속 다이어그램 :
Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport에 대한 협력 다이어그램:

Public 멤버 함수

async Task< PlcResult > ConnectAsync (string host, int port, int timeoutMs, CancellationToken cancellationToken=default)
async Task< PlcResult > DisconnectAsync (CancellationToken cancellationToken=default)
async Task< PlcResult< byte[]> > SendAndReceiveAsync (IReadOnlyList< byte > requestFrame, int receiveTimeoutMs, int retryCount, CancellationToken cancellationToken=default)
async ValueTask DisposeAsync ()

속성

bool IsConnected [get]

Private 멤버 함수

Task CloseCoreAsync ()
void ThrowIfDisposed ()

정적 Private 멤버 함수

static async Task< byte[]> ReceiveBinary3EFrameAsync (NetworkStream stream, CancellationToken cancellationToken)
static async Task ReadExactlyAsync (NetworkStream stream, byte[] buffer, CancellationToken cancellationToken)

Private 속성

readonly SemaphoreSlim _syncLock = new(1, 1)
TcpClient? _tcpClient
NetworkStream? _stream
bool _disposed

상세한 설명

Mitsubishi MC 프로토콜용 TCP 전송을 제공합니다.

TcpMitsubishiMcTransport.cs 파일의 14 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ CloseCoreAsync()

Task Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.CloseCoreAsync ( )
inlineprivate

내부 TCP 스트림과 클라이언트를 닫고 참조를 지웁니다.

반환값
완료된 작업입니다.

TcpMitsubishiMcTransport.cs 파일의 520 번째 라인에서 정의되었습니다.

521 {
522 try
523 {
524 _stream?.Close();
525 _stream?.Dispose();
526
527 _tcpClient?.Close();
528 _tcpClient?.Dispose();
529 }
530 finally
531 {
532 _stream = null;
533 _tcpClient = null;
534 }
535
536 return Task.CompletedTask;
537 }

다음을 참조함 : _stream, _tcpClient.

다음에 의해서 참조됨 : ConnectAsync(), DisconnectAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ConnectAsync()

async Task< PlcResult > Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.ConnectAsync ( string host,
int port,
int timeoutMs,
CancellationToken cancellationToken = default )
inline

제한 시간 내 대상 TCP 끝점에 연결합니다.

매개변수
host호스트입니다.
port포트입니다.
timeoutMs제한 시간입니다.
cancellationToken취소 토큰입니다.
반환값
연결 결과입니다.
예외
ArgumentException호스트가 비어 있는 경우 발생합니다.
OperationCanceledException동기화 잠금 대기 중 취소된 경우 발생합니다.

Dreamine.PLC.Mitsubishi.MC.Transport.IMitsubishiMcTransport를 구현.

TcpMitsubishiMcTransport.cs 파일의 120 번째 라인에서 정의되었습니다.

125 {
126 ArgumentException.ThrowIfNullOrWhiteSpace(host);
127
128 if (port is <= 0 or > 65535)
129 {
130 return PlcResult.Failure($"Invalid TCP port: {port}");
131 }
132
133 if (timeoutMs <= 0)
134 {
135 return PlcResult.Failure("The connection timeout must be greater than zero.");
136 }
137
138 await _syncLock.WaitAsync(cancellationToken).ConfigureAwait(false);
139
140 try
141 {
142 ThrowIfDisposed();
143
144 if (IsConnected)
145 {
146 return PlcResult.Success();
147 }
148
149 await CloseCoreAsync().ConfigureAwait(false);
150
151 _tcpClient = new TcpClient
152 {
153 NoDelay = true
154 };
155
156 using var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
157 timeoutCts.CancelAfter(timeoutMs);
158
159 await _tcpClient.ConnectAsync(host, port, timeoutCts.Token).ConfigureAwait(false);
160 _stream = _tcpClient.GetStream();
161
162 return PlcResult.Success();
163 }
164 catch (OperationCanceledException ex)
165 {
166 await CloseCoreAsync().ConfigureAwait(false);
167 return PlcResult.Failure(ex.Message);
168 }
169 catch (Exception ex)
170 {
171 await CloseCoreAsync().ConfigureAwait(false);
172 return PlcResult.Failure(ex.Message);
173 }
174 finally
175 {
176 _syncLock.Release();
177 }
178 }

다음을 참조함 : _stream, _syncLock, _tcpClient, CloseCoreAsync(), IsConnected, ThrowIfDisposed().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ DisconnectAsync()

async Task< PlcResult > Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.DisconnectAsync ( CancellationToken cancellationToken = default)
inline

TCP 스트림과 클라이언트를 닫습니다.

매개변수
cancellationToken취소 토큰입니다.
반환값
연결 해제 결과입니다.
예외
OperationCanceledException잠금 대기 중 취소된 경우 발생합니다.

Dreamine.PLC.Mitsubishi.MC.Transport.IMitsubishiMcTransport를 구현.

TcpMitsubishiMcTransport.cs 파일의 209 번째 라인에서 정의되었습니다.

210 {
211 await _syncLock.WaitAsync(cancellationToken).ConfigureAwait(false);
212
213 try
214 {
215 await CloseCoreAsync().ConfigureAwait(false);
216 return PlcResult.Success();
217 }
218 catch (Exception ex)
219 {
220 return PlcResult.Failure(ex.Message);
221 }
222 finally
223 {
224 _syncLock.Release();
225 }
226 }

다음을 참조함 : _syncLock, CloseCoreAsync().

다음에 의해서 참조됨 : DisposeAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ DisposeAsync()

async ValueTask Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.DisposeAsync ( )
inline

연결과 동기화 리소스를 비동기 해제합니다.

반환값
비동기 해제 작업입니다.

TcpMitsubishiMcTransport.cs 파일의 355 번째 라인에서 정의되었습니다.

356 {
357 if (_disposed)
358 {
359 return;
360 }
361
362 await DisconnectAsync().ConfigureAwait(false);
363
364 _syncLock.Dispose();
365 _disposed = true;
366
367 GC.SuppressFinalize(this);
368 }

다음을 참조함 : _disposed, _syncLock, DisconnectAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ReadExactlyAsync()

async Task Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.ReadExactlyAsync ( NetworkStream stream,
byte[] buffer,
CancellationToken cancellationToken )
inlinestaticprivate

버퍼가 찰 때까지 스트림을 반복해서 읽습니다.

매개변수
stream스트림입니다.
buffer대상 버퍼입니다.
cancellationToken취소 토큰입니다.
반환값
비동기 읽기 작업입니다.
예외
IOException버퍼가 차기 전에 연결이 닫힌 경우 발생합니다.

TcpMitsubishiMcTransport.cs 파일의 483 번째 라인에서 정의되었습니다.

487 {
488 var offset = 0;
489
490 while (offset < buffer.Length)
491 {
492 var read = await stream.ReadAsync(
493 buffer.AsMemory(offset, buffer.Length - offset),
494 cancellationToken).ConfigureAwait(false);
495
496 if (read == 0)
497 {
498 throw new IOException("The remote PLC closed the TCP connection.");
499 }
500
501 offset += read;
502 }
503 }

다음에 의해서 참조됨 : ReceiveBinary3EFrameAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReceiveBinary3EFrameAsync()

async Task< byte[]> Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.ReceiveBinary3EFrameAsync ( NetworkStream stream,
CancellationToken cancellationToken )
inlinestaticprivate

Binary 3E 헤더와 선언된 길이의 본문을 정확히 읽습니다.

매개변수
stream네트워크 스트림입니다.
cancellationToken취소 토큰입니다.
반환값
완전한 응답 프레임입니다.
예외
InvalidOperationException응답 데이터 길이가 2 미만인 경우 발생합니다.
IOException응답 도중 원격 연결이 닫힌 경우 발생합니다.

TcpMitsubishiMcTransport.cs 파일의 413 번째 라인에서 정의되었습니다.

416 {
417 var header = new byte[9];
418
419 await ReadExactlyAsync(stream, header, cancellationToken).ConfigureAwait(false);
420
421 var responseDataLength = header[7] | (header[8] << 8);
422 if (responseDataLength < 2)
423 {
424 throw new InvalidOperationException(
425 $"Invalid Mitsubishi MC response data length: {responseDataLength}");
426 }
427
428 var body = new byte[responseDataLength];
429
430 await ReadExactlyAsync(stream, body, cancellationToken).ConfigureAwait(false);
431
432 var frame = new byte[header.Length + body.Length];
433
434 Buffer.BlockCopy(header, 0, frame, 0, header.Length);
435 Buffer.BlockCopy(body, 0, frame, header.Length, body.Length);
436
437 return frame;
438 }

다음을 참조함 : ReadExactlyAsync().

다음에 의해서 참조됨 : SendAndReceiveAsync().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SendAndReceiveAsync()

async Task< PlcResult< byte[]> > Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.SendAndReceiveAsync ( IReadOnlyList< byte > requestFrame,
int receiveTimeoutMs,
int retryCount,
CancellationToken cancellationToken = default )
inline

Binary 3E 요청을 보내고 길이 헤더에 따라 완전한 응답을 읽습니다.

매개변수
requestFrame요청 프레임입니다.
receiveTimeoutMs수신 제한 시간입니다.
retryCountTCP에서 사용하지 않는 재시도 수입니다.
cancellationToken취소 토큰입니다.
반환값
응답 프레임 결과입니다.
예외
ArgumentNullException요청이 null인 경우 발생합니다.
OperationCanceledException잠금 대기 중 취소된 경우 발생합니다.

Dreamine.PLC.Mitsubishi.MC.Transport.IMitsubishiMcTransport를 구현.

TcpMitsubishiMcTransport.cs 파일의 285 번째 라인에서 정의되었습니다.

290 {
291 ArgumentNullException.ThrowIfNull(requestFrame);
292
293 if (requestFrame.Count == 0)
294 {
295 return PlcResult<byte[]>.Failure("The request frame must not be empty.");
296 }
297
298 if (receiveTimeoutMs <= 0)
299 {
300 return PlcResult<byte[]>.Failure("The receive timeout must be greater than zero.");
301 }
302
303 await _syncLock.WaitAsync(cancellationToken).ConfigureAwait(false);
304
305 try
306 {
307 ThrowIfDisposed();
308
309 if (_stream is null || _tcpClient is null || !_tcpClient.Connected)
310 {
311 return PlcResult<byte[]>.Failure("The TCP transport is not connected.");
312 }
313
314 var requestBuffer = requestFrame as byte[] ?? requestFrame.ToArray();
315
316 using var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
317 timeoutCts.CancelAfter(receiveTimeoutMs);
318
319 await _stream.WriteAsync(requestBuffer, timeoutCts.Token).ConfigureAwait(false);
320 await _stream.FlushAsync(timeoutCts.Token).ConfigureAwait(false);
321
322 var response = await ReceiveBinary3EFrameAsync(_stream, timeoutCts.Token).ConfigureAwait(false);
323
324 return PlcResult<byte[]>.Success(response);
325 }
326 catch (OperationCanceledException ex)
327 {
328 return PlcResult<byte[]>.Failure(ex.Message);
329 }
330 catch (Exception ex)
331 {
332 return PlcResult<byte[]>.Failure(ex.Message);
333 }
334 finally
335 {
336 _syncLock.Release();
337 }
338 }

다음을 참조함 : _stream, _syncLock, _tcpClient, ReceiveBinary3EFrameAsync(), ThrowIfDisposed().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ThrowIfDisposed()

void Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.ThrowIfDisposed ( )
inlineprivate

전송이 이미 해제되었으면 예외를 발생시킵니다.

예외
ObjectDisposedException해제된 경우 발생합니다.

TcpMitsubishiMcTransport.cs 파일의 554 번째 라인에서 정의되었습니다.

555 {
556 ObjectDisposedException.ThrowIf(_disposed, GetType().Name);
557 }

다음을 참조함 : _disposed.

다음에 의해서 참조됨 : ConnectAsync(), SendAndReceiveAsync().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ _disposed

bool Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport._disposed
private

disposed 값을 보관합니다.

TcpMitsubishiMcTransport.cs 파일의 51 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : DisposeAsync(), ThrowIfDisposed().

◆ _stream

NetworkStream? Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport._stream
private

stream 값을 보관합니다.

TcpMitsubishiMcTransport.cs 파일의 42 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : CloseCoreAsync(), ConnectAsync(), SendAndReceiveAsync().

◆ _syncLock

readonly SemaphoreSlim Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport._syncLock = new(1, 1)
private

sync Lock 값을 보관합니다.

TcpMitsubishiMcTransport.cs 파일의 24 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ConnectAsync(), DisconnectAsync(), DisposeAsync(), SendAndReceiveAsync().

◆ _tcpClient

TcpClient? Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport._tcpClient
private

tcp Client 값을 보관합니다.

TcpMitsubishiMcTransport.cs 파일의 33 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : CloseCoreAsync(), ConnectAsync(), SendAndReceiveAsync().

속성 문서화

◆ IsConnected

bool Dreamine.PLC.Mitsubishi.MC.Transport.TcpMitsubishiMcTransport.IsConnected
get

TCP 클라이언트와 스트림의 연결 여부를 가져옵니다.

Dreamine.PLC.Mitsubishi.MC.Transport.IMitsubishiMcTransport를 구현.

TcpMitsubishiMcTransport.cs 파일의 61 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : ConnectAsync().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: