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

더 자세히 ...

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

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 속성

readonly SemaphoreSlim _syncLock = new(1, 1)
UdpClient? _udpClient
IPEndPoint? _remoteEndPoint
bool _disposed

정적 Private 속성

const int MaximumMcResponseFrameLength = 8192

상세한 설명

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

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

멤버 함수 문서화

◆ CloseCoreAsync()

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

내부 UDP 클라이언트를 닫고 참조를 지웁니다.

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

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

428 {
429 try
430 {
431 _udpClient?.Close();
432 _udpClient?.Dispose();
433 }
434 finally
435 {
436 _udpClient = null;
437 _remoteEndPoint = null;
438 }
439
440 return Task.CompletedTask;
441 }

다음을 참조함 : _remoteEndPoint, _udpClient.

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

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

◆ ConnectAsync()

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

호스트를 확인하고 연결된 UDP 클라이언트를 준비합니다.

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

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

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

135 {
136 ArgumentException.ThrowIfNullOrWhiteSpace(host);
137
138 if (port is <= 0 or > 65535)
139 {
140 return PlcResult.Failure($"Invalid UDP port: {port}");
141 }
142
143 if (timeoutMs <= 0)
144 {
145 return PlcResult.Failure("The connection timeout must be greater than zero.");
146 }
147
148 await _syncLock.WaitAsync(cancellationToken).ConfigureAwait(false);
149
150 try
151 {
152 ThrowIfDisposed();
153
154 await CloseCoreAsync().ConfigureAwait(false);
155
156 var addresses = await Dns.GetHostAddressesAsync(host, cancellationToken).ConfigureAwait(false);
157 var address = addresses.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork)
158 ?? addresses.FirstOrDefault();
159
160 if (address is null)
161 {
162 return PlcResult.Failure($"Failed to resolve UDP host: {host}");
163 }
164
165 _remoteEndPoint = new IPEndPoint(address, port);
166 _udpClient = new UdpClient(address.AddressFamily);
167 _udpClient.Connect(_remoteEndPoint);
168
169 return PlcResult.Success();
170 }
171 catch (OperationCanceledException ex)
172 {
173 await CloseCoreAsync().ConfigureAwait(false);
174 return PlcResult.Failure(ex.Message);
175 }
176 catch (Exception ex)
177 {
178 await CloseCoreAsync().ConfigureAwait(false);
179 return PlcResult.Failure(ex.Message);
180 }
181 finally
182 {
183 _syncLock.Release();
184 }
185 }

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

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

◆ DisconnectAsync()

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

UDP 클라이언트와 원격 끝점 정보를 해제합니다.

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

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

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

217 {
218 await _syncLock.WaitAsync(cancellationToken).ConfigureAwait(false);
219
220 try
221 {
222 await CloseCoreAsync().ConfigureAwait(false);
223 return PlcResult.Success();
224 }
225 catch (Exception ex)
226 {
227 return PlcResult.Failure(ex.Message);
228 }
229 finally
230 {
231 _syncLock.Release();
232 }
233 }

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

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

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

◆ DisposeAsync()

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

UDP 클라이언트와 동기화 리소스를 비동기 해제합니다.

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

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

398 {
399 if (_disposed)
400 {
401 return;
402 }
403
404 await DisconnectAsync().ConfigureAwait(false);
405
406 _syncLock.Dispose();
407 _disposed = true;
408
409 GC.SuppressFinalize(this);
410 }

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

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

◆ SendAndReceiveAsync()

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

UDP 요청을 보내고 제한 시간 실패 시 구성된 횟수만큼 재시도합니다.

매개변수
requestFrame요청 프레임입니다.
receiveTimeoutMs수신 제한 시간입니다.
retryCount재시도 횟수입니다.
cancellationToken취소 토큰입니다.
반환값
응답 데이터그램 결과입니다.
예외
ArgumentNullException요청이 null인 경우 발생합니다.
OperationCanceledException잠금 대기 중 취소된 경우 발생합니다.

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

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

297 {
298 ArgumentNullException.ThrowIfNull(requestFrame);
299
300 if (requestFrame.Count == 0)
301 {
302 return PlcResult<byte[]>.Failure("The request frame must not be empty.");
303 }
304
305 if (receiveTimeoutMs <= 0)
306 {
307 return PlcResult<byte[]>.Failure("The receive timeout must be greater than zero.");
308 }
309
310 await _syncLock.WaitAsync(cancellationToken).ConfigureAwait(false);
311
312 try
313 {
314 ThrowIfDisposed();
315
316 if (_udpClient is null || _remoteEndPoint is null)
317 {
318 return PlcResult<byte[]>.Failure("The UDP transport is not ready.");
319 }
320
321 var attempts = Math.Max(1, retryCount);
322 var requestBuffer = requestFrame as byte[] ?? requestFrame.ToArray();
323 Exception? lastException = null;
324
325 for (var attempt = 1; attempt <= attempts; attempt++)
326 {
327 cancellationToken.ThrowIfCancellationRequested();
328
329 using var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
330 timeoutCts.CancelAfter(receiveTimeoutMs);
331
332 try
333 {
334 await _udpClient.SendAsync(requestBuffer, requestBuffer.Length).WaitAsync(timeoutCts.Token).ConfigureAwait(false);
335 var response = await _udpClient.ReceiveAsync().WaitAsync(timeoutCts.Token).ConfigureAwait(false);
336
337 if (response.Buffer.Length == 0)
338 {
339 lastException = new IOException("The UDP PLC response was empty.");
340 continue;
341 }
342
343 if (response.Buffer.Length > MaximumMcResponseFrameLength)
344 {
345 return PlcResult<byte[]>.Failure(
346 $"The UDP PLC response frame is too large. Length: {response.Buffer.Length}");
347 }
348
349 return PlcResult<byte[]>.Success(response.Buffer);
350 }
351 catch (OperationCanceledException ex) when (!cancellationToken.IsCancellationRequested)
352 {
353 lastException = ex;
354 }
355 catch (SocketException ex)
356 {
357 lastException = ex;
358 }
359 catch (IOException ex)
360 {
361 lastException = ex;
362 }
363 }
364
365 return PlcResult<byte[]>.Failure(
366 lastException?.Message ?? "The UDP PLC request timed out.");
367 }
368 catch (OperationCanceledException ex)
369 {
370 return PlcResult<byte[]>.Failure(ex.Message);
371 }
372 catch (Exception ex)
373 {
374 return PlcResult<byte[]>.Failure(ex.Message);
375 }
376 finally
377 {
378 _syncLock.Release();
379 }
380 }

다음을 참조함 : _remoteEndPoint, _syncLock, _udpClient, MaximumMcResponseFrameLength, ThrowIfDisposed().

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

◆ ThrowIfDisposed()

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

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

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

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

459 {
460 ObjectDisposedException.ThrowIf(_disposed, GetType().Name);
461 }

다음을 참조함 : _disposed.

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

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

멤버 데이터 문서화

◆ _disposed

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

disposed 값을 보관합니다.

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

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

◆ _remoteEndPoint

IPEndPoint? Dreamine.PLC.Mitsubishi.MC.Transport.UdpMitsubishiMcTransport._remoteEndPoint
private

remote End Point 값을 보관합니다.

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

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

◆ _syncLock

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

sync Lock 값을 보관합니다.

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

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

◆ _udpClient

UdpClient? Dreamine.PLC.Mitsubishi.MC.Transport.UdpMitsubishiMcTransport._udpClient
private

udp Client 값을 보관합니다.

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

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

◆ MaximumMcResponseFrameLength

const int Dreamine.PLC.Mitsubishi.MC.Transport.UdpMitsubishiMcTransport.MaximumMcResponseFrameLength = 8192
staticprivate

Maximum Mc Response Frame Length 값을 보관합니다.

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

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

속성 문서화

◆ IsConnected

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

UDP 클라이언트와 원격 끝점 준비 여부를 가져옵니다.

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

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


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