Dreamine.PLC.Omron.Fins 1.0.1
Dreamine.PLC.Omron.Fins 산업 자동화 및 I/O 기능을 제공합니다.
로딩중...
검색중...
일치하는것 없음
OmronFinsPlcClient.cs
이 파일의 문서화 페이지로 가기
1using Dreamine.PLC.Abstractions.Devices;
2using Dreamine.PLC.Abstractions.Results;
3using Dreamine.PLC.Core.Clients;
7
9
18public sealed class OmronFinsPlcClient : PlcClientBase
19{
56
90 : this(options, CreateTransport(options), new OmronFinsFrameBuilder(), new OmronFinsResponseParser())
91 {
92 }
93
144 IOmronFinsTransport transport,
145 OmronFinsFrameBuilder frameBuilder,
146 OmronFinsResponseParser responseParser)
147 {
148 _options = options ?? throw new ArgumentNullException(nameof(options));
149 _transport = transport ?? throw new ArgumentNullException(nameof(transport));
150 _frameBuilder = frameBuilder ?? throw new ArgumentNullException(nameof(frameBuilder));
151 _responseParser = responseParser ?? throw new ArgumentNullException(nameof(responseParser));
152 }
153
163
196 protected override Task<PlcResult> ConnectCoreAsync(CancellationToken cancellationToken)
197 {
198 return _transport.ConnectAsync(cancellationToken);
199 }
200
233 protected override Task<PlcResult> DisconnectCoreAsync(CancellationToken cancellationToken)
234 {
235 return _transport.DisconnectAsync(cancellationToken);
236 }
237
286 protected override async Task<PlcResult<bool[]>> ReadBitsCoreAsync(
287 PlcAddress address,
288 int count,
289 CancellationToken cancellationToken)
290 {
291 byte[] request;
292 try
293 {
294 request = _frameBuilder.BuildMemoryAreaRead(_options, address, count, bitAccess: true);
295 }
296 catch (Exception ex)
297 {
298 return PlcResult<bool[]>.Failure(ex.Message);
299 }
300
301 var responseResult = await _transport.SendAndReceiveAsync(
302 request,
303 _options.ReceiveTimeoutMs,
304 _options.RetryCount,
305 cancellationToken).ConfigureAwait(false);
306
307 if (!responseResult.IsSuccess || responseResult.Value is null)
308 {
309 return PlcResult<bool[]>.Failure(responseResult.Message ?? "Failed to receive FINS bit read response.", responseResult.ErrorCode);
310 }
311
312 var payloadResult = _responseParser.ExtractPayload(responseResult.Value);
313 if (!payloadResult.IsSuccess || payloadResult.Value is null)
314 {
315 return PlcResult<bool[]>.Failure(payloadResult.Message ?? "Failed to parse FINS bit read payload.", payloadResult.ErrorCode);
316 }
317
318 return _responseParser.ParseBits(payloadResult.Value, count);
319 }
320
369 protected override async Task<PlcResult<short[]>> ReadWordsCoreAsync(
370 PlcAddress address,
371 int count,
372 CancellationToken cancellationToken)
373 {
374 byte[] request;
375 try
376 {
377 request = _frameBuilder.BuildMemoryAreaRead(_options, address, count, bitAccess: false);
378 }
379 catch (Exception ex)
380 {
381 return PlcResult<short[]>.Failure(ex.Message);
382 }
383
384 var responseResult = await _transport.SendAndReceiveAsync(
385 request,
386 _options.ReceiveTimeoutMs,
387 _options.RetryCount,
388 cancellationToken).ConfigureAwait(false);
389
390 if (!responseResult.IsSuccess || responseResult.Value is null)
391 {
392 return PlcResult<short[]>.Failure(responseResult.Message ?? "Failed to receive FINS word read response.", responseResult.ErrorCode);
393 }
394
395 var payloadResult = _responseParser.ExtractPayload(responseResult.Value);
396 if (!payloadResult.IsSuccess || payloadResult.Value is null)
397 {
398 return PlcResult<short[]>.Failure(payloadResult.Message ?? "Failed to parse FINS word read payload.", payloadResult.ErrorCode);
399 }
400
401 return _responseParser.ParseWords(payloadResult.Value, count);
402 }
403
452 protected override async Task<PlcResult> WriteBitsCoreAsync(
453 PlcAddress address,
454 IReadOnlyList<bool> values,
455 CancellationToken cancellationToken)
456 {
457 byte[] request;
458 try
459 {
460 request = _frameBuilder.BuildMemoryAreaWriteBits(_options, address, values);
461 }
462 catch (Exception ex)
463 {
464 return PlcResult.Failure(ex.Message);
465 }
466
467 var responseResult = await _transport.SendAndReceiveAsync(
468 request,
469 _options.ReceiveTimeoutMs,
470 _options.RetryCount,
471 cancellationToken).ConfigureAwait(false);
472
473 if (!responseResult.IsSuccess || responseResult.Value is null)
474 {
475 return PlcResult.Failure(responseResult.Message ?? "Failed to receive FINS bit write response.", responseResult.ErrorCode);
476 }
477
478 var payloadResult = _responseParser.ExtractPayload(responseResult.Value);
479 return payloadResult.IsSuccess
480 ? PlcResult.Success()
481 : PlcResult.Failure(payloadResult.Message ?? "Failed to parse FINS bit write response.", payloadResult.ErrorCode);
482 }
483
532 protected override async Task<PlcResult> WriteWordsCoreAsync(
533 PlcAddress address,
534 IReadOnlyList<short> values,
535 CancellationToken cancellationToken)
536 {
537 byte[] request;
538 try
539 {
540 request = _frameBuilder.BuildMemoryAreaWriteWords(_options, address, values);
541 }
542 catch (Exception ex)
543 {
544 return PlcResult.Failure(ex.Message);
545 }
546
547 var responseResult = await _transport.SendAndReceiveAsync(
548 request,
549 _options.ReceiveTimeoutMs,
550 _options.RetryCount,
551 cancellationToken).ConfigureAwait(false);
552
553 if (!responseResult.IsSuccess || responseResult.Value is null)
554 {
555 return PlcResult.Failure(responseResult.Message ?? "Failed to receive FINS word write response.", responseResult.ErrorCode);
556 }
557
558 var payloadResult = _responseParser.ExtractPayload(responseResult.Value);
559 return payloadResult.IsSuccess
560 ? PlcResult.Success()
561 : PlcResult.Failure(payloadResult.Message ?? "Failed to parse FINS word write response.", payloadResult.ErrorCode);
562 }
563
580 public override async ValueTask DisposeAsync()
581 {
582 await base.DisposeAsync().ConfigureAwait(false);
583 await _transport.DisposeAsync().ConfigureAwait(false);
584 }
585
627 {
628 ArgumentNullException.ThrowIfNull(options);
629
630 return options.TransportType switch
631 {
634 _ => throw new ArgumentOutOfRangeException(nameof(options), options.TransportType, "Unsupported Omron FINS transport type.")
635 };
636 }
637}
static IOmronFinsTransport CreateTransport(OmronFinsConnectionOptions options)
override async Task< PlcResult > WriteBitsCoreAsync(PlcAddress address, IReadOnlyList< bool > values, CancellationToken cancellationToken)
override Task< PlcResult > DisconnectCoreAsync(CancellationToken cancellationToken)
override async Task< PlcResult< bool[]> > ReadBitsCoreAsync(PlcAddress address, int count, CancellationToken cancellationToken)
OmronFinsPlcClient(OmronFinsConnectionOptions options)
override async Task< PlcResult< short[]> > ReadWordsCoreAsync(PlcAddress address, int count, CancellationToken cancellationToken)
OmronFinsPlcClient(OmronFinsConnectionOptions options, IOmronFinsTransport transport, OmronFinsFrameBuilder frameBuilder, OmronFinsResponseParser responseParser)
override Task< PlcResult > ConnectCoreAsync(CancellationToken cancellationToken)
override async Task< PlcResult > WriteWordsCoreAsync(PlcAddress address, IReadOnlyList< short > values, CancellationToken cancellationToken)