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

더 자세히 ...

Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol에 대한 협력 다이어그램:

클래스

struct  FinsRequest

Public 멤버 함수

 OmronFinsSimulatorProtocol (InMemoryPlcMemory memory, OmronFinsSimulatorServerOptions options)
byte[] HandleRequest (IReadOnlyList< byte > requestFrame)

이벤트

EventHandler< string >? StatusChanged

Private 멤버 함수

byte[] HandleRead (byte[] requestFrame, FinsRequest request)
byte[] HandleWrite (byte[] requestFrame, FinsRequest request)
void ApplyAutoWordResponse (PlcAddress writeAddress, IReadOnlyList< short > values)

정적 Private 멤버 함수

static bool TryParseRequest (byte[] frame, out FinsRequest request, out string? errorMessage)
static byte[] BuildErrorResponse (byte[] requestFrame, ushort endCode)
static byte[] BuildResponse (byte[] requestFrame, ushort command, ushort endCode, IReadOnlyList< byte > payload)

Private 속성

readonly InMemoryPlcMemory _memory
readonly OmronFinsSimulatorServerOptions _options

상세한 설명

메모리 읽기·쓰기 테스트를 위한 최소 Omron FINS 시뮬레이터 프로토콜을 실행합니다.

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

생성자 & 소멸자 문서화

◆ OmronFinsSimulatorProtocol()

Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.OmronFinsSimulatorProtocol ( InMemoryPlcMemory memory,
OmronFinsSimulatorServerOptions options )
inline

T:Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol 클래스의 새 인스턴스를 초기화합니다.

매개변수
memory요청 간에 공유할 PLC 메모리입니다.
options자동 응답 동작을 포함하는 시뮬레이터 옵션입니다.
예외
ArgumentNullExceptionmemory 또는 optionsnull일 때 발생합니다.

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

71 {
72 _memory = memory ?? throw new ArgumentNullException(nameof(memory));
73 _options = options ?? throw new ArgumentNullException(nameof(options));
74 }

다음을 참조함 : _memory, _options.

멤버 함수 문서화

◆ ApplyAutoWordResponse()

void Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.ApplyAutoWordResponse ( PlcAddress writeAddress,
IReadOnlyList< short > values )
inlineprivate

구성된 트리거 주소의 단일 워드 쓰기에 자동 응답 값을 적용합니다.

매개변수
writeAddress원래 쓰기 대상 주소입니다.
values기록된 워드 값입니다.

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

310 {
311 if (!_options.EnableAutoWordResponse || values.Count != 1)
312 {
313 return;
314 }
315
316 if (writeAddress.DeviceType != PlcDeviceType.D || writeAddress.Offset != _options.AutoResponseTriggerOffset)
317 {
318 return;
319 }
320
321 var rawResponseValue = values[0] + _options.AutoResponseIncrement;
322 if (rawResponseValue is < short.MinValue or > short.MaxValue)
323 {
324 StatusChanged?.Invoke(this, $"FINS auto response skipped: value overflow. value={rawResponseValue}");
325 return;
326 }
327
328 var responseValue = (short)rawResponseValue;
329 var responseAddress = new PlcAddress(PlcDeviceType.D, _options.AutoResponseOffset);
330 _memory.WriteWords(responseAddress, [responseValue]);
331 StatusChanged?.Invoke(this, $"FINS auto response: D{_options.AutoResponseOffset}={responseValue}");
332 }

다음을 참조함 : _memory, _options, StatusChanged.

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

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

◆ BuildErrorResponse()

byte[] Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.BuildErrorResponse ( byte[] requestFrame,
ushort endCode )
inlinestaticprivate

요청 프레임을 기반으로 지정한 종료 코드의 오류 응답을 생성합니다.

매개변수
requestFrame응답 주소와 명령을 가져올 요청 프레임입니다.
endCode응답에 기록할 FINS 종료 코드입니다.
반환값
페이로드가 없는 FINS 오류 응답입니다.

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

441 {
442 var command = requestFrame.Length >= 12 ? OmronFinsEndian.ReadUInt16(requestFrame, 10) : (ushort)0;
443 return BuildResponse(requestFrame, command, endCode, []);
444 }

다음을 참조함 : BuildResponse(), Dreamine.PLC.Omron.Fins.Protocol.OmronFinsEndian.ReadUInt16().

다음에 의해서 참조됨 : HandleRead(), HandleRequest(), HandleWrite().

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

◆ BuildResponse()

byte[] Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.BuildResponse ( byte[] requestFrame,
ushort command,
ushort endCode,
IReadOnlyList< byte > payload )
inlinestaticprivate

요청의 주소를 반전하고 명령·종료 코드·페이로드를 포함하는 FINS 응답을 생성합니다.

매개변수
requestFrame헤더 값을 가져올 원본 요청 프레임입니다.
command응답에 에코할 명령 코드입니다.
endCodeFINS 종료 코드입니다.
payload응답 뒤에 추가할 페이로드입니다.
반환값
생성된 원시 FINS 응답 프레임입니다.
예외
ArgumentNullExceptionrequestFrame 또는 payloadnull일 때 발생할 수 있습니다.

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

503 {
504 var response = new byte[14 + payload.Count];
505 response[0] = requestFrame.Length > 0 ? requestFrame[0] : (byte)0xC0;
506 response[1] = requestFrame.Length > 1 ? requestFrame[1] : (byte)0x00;
507 response[2] = requestFrame.Length > 2 ? requestFrame[2] : (byte)0x02;
508
509 response[3] = requestFrame.Length > 6 ? requestFrame[6] : (byte)0x00;
510 response[4] = requestFrame.Length > 7 ? requestFrame[7] : (byte)0x00;
511 response[5] = requestFrame.Length > 8 ? requestFrame[8] : (byte)0x00;
512 response[6] = requestFrame.Length > 3 ? requestFrame[3] : (byte)0x00;
513 response[7] = requestFrame.Length > 4 ? requestFrame[4] : (byte)0x00;
514 response[8] = requestFrame.Length > 5 ? requestFrame[5] : (byte)0x00;
515 response[9] = requestFrame.Length > 9 ? requestFrame[9] : (byte)0x00;
516
517 OmronFinsEndian.WriteUInt16(response, 10, command);
518 OmronFinsEndian.WriteUInt16(response, 12, endCode);
519
520 for (var index = 0; index < payload.Count; index++)
521 {
522 response[14 + index] = payload[index];
523 }
524
525 return response;
526 }

다음을 참조함 : Dreamine.PLC.Omron.Fins.Protocol.OmronFinsEndian.WriteUInt16().

다음에 의해서 참조됨 : BuildErrorResponse(), HandleRead(), HandleWrite().

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

◆ HandleRead()

byte[] Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.HandleRead ( byte[] requestFrame,
FinsRequest request )
inlineprivate

구문 분석된 메모리 영역 읽기 요청을 공유 메모리에서 실행합니다.

매개변수
requestFrame응답 헤더 생성에 사용할 원본 요청 프레임입니다.
request구문 분석된 읽기 요청입니다.
반환값
비트 또는 워드 페이로드를 포함하는 FINS 응답입니다.

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

170 {
171 if (request.IsBitAccess)
172 {
173 var readResult = _memory.ReadBits(request.Address, request.Count);
174 if (!readResult.IsSuccess || readResult.Value is null)
175 {
176 return BuildErrorResponse(requestFrame, 0x2101);
177 }
178
179 var payload = readResult.Value.Select(value => value ? (byte)1 : (byte)0).ToArray();
180 return BuildResponse(requestFrame, request.Command, 0, payload);
181 }
182
183 var wordResult = _memory.ReadWords(request.Address, request.Count);
184 if (!wordResult.IsSuccess || wordResult.Value is null)
185 {
186 return BuildErrorResponse(requestFrame, 0x2101);
187 }
188
189 var wordPayload = new byte[wordResult.Value.Length * 2];
190 for (var index = 0; index < wordResult.Value.Length; index++)
191 {
192 OmronFinsEndian.WriteInt16(wordPayload, index * 2, wordResult.Value[index]);
193 }
194
195 return BuildResponse(requestFrame, request.Command, 0, wordPayload);
196 }

다음을 참조함 : _memory, BuildErrorResponse(), BuildResponse(), Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.FinsRequest.IsBitAccess, Dreamine.PLC.Omron.Fins.Protocol.OmronFinsEndian.WriteInt16().

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

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

◆ HandleRequest()

byte[] Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.HandleRequest ( IReadOnlyList< byte > requestFrame)
inline

원시 FINS 요청 프레임을 처리하고 대응하는 원시 응답 프레임을 반환합니다.

매개변수
requestFrame처리할 원시 FINS 요청 프레임입니다.
반환값
성공 페이로드 또는 FINS 종료 코드를 포함하는 원시 응답 프레임입니다.
예외
ArgumentNullExceptionrequestFramenull일 때 발생합니다.

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

119 {
120 ArgumentNullException.ThrowIfNull(requestFrame);
121 var request = requestFrame as byte[] ?? requestFrame.ToArray();
122
123 if (!TryParseRequest(request, out var parsed, out var errorMessage))
124 {
125 StatusChanged?.Invoke(this, errorMessage ?? "Invalid FINS request.");
126 return BuildErrorResponse(request, 0x1101);
127 }
128
129 return parsed.Command switch
130 {
131 (ushort)OmronFinsCommand.MemoryAreaRead => HandleRead(request, parsed),
132 (ushort)OmronFinsCommand.MemoryAreaWrite => HandleWrite(request, parsed),
133 _ => BuildErrorResponse(request, 0x0101)
134 };
135 }

다음을 참조함 : BuildErrorResponse(), HandleRead(), HandleWrite(), StatusChanged, TryParseRequest().

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

◆ HandleWrite()

byte[] Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.HandleWrite ( byte[] requestFrame,
FinsRequest request )
inlineprivate

구문 분석된 메모리 영역 쓰기 요청을 공유 메모리에 실행합니다.

매개변수
requestFrame응답 헤더 생성에 사용할 원본 요청 프레임입니다.
request구문 분석된 쓰기 요청입니다.
반환값
성공 또는 유효성·메모리 오류 종료 코드를 포함하는 FINS 응답입니다.
예외
OverflowException워드 개수에 2를 곱한 예상 데이터 길이가 정수 범위를 벗어날 때 발생할 수 있습니다.

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

239 {
240 if (request.IsBitAccess)
241 {
242 if (request.Data.Length < request.Count)
243 {
244 return BuildErrorResponse(requestFrame, 0x1101);
245 }
246
247 var values = new bool[request.Count];
248 for (var index = 0; index < request.Count; index++)
249 {
250 values[index] = request.Data[index] != 0;
251 }
252
253 var writeResult = _memory.WriteBits(request.Address, values);
254 if (!writeResult.IsSuccess)
255 {
256 return BuildErrorResponse(requestFrame, 0x2101);
257 }
258 }
259 else
260 {
261 var expectedLength = checked(request.Count * 2);
262 if (request.Data.Length < expectedLength)
263 {
264 return BuildErrorResponse(requestFrame, 0x1101);
265 }
266
267 var values = new short[request.Count];
268 for (var index = 0; index < request.Count; index++)
269 {
270 values[index] = OmronFinsEndian.ReadInt16(request.Data, index * 2);
271 }
272
273 var writeResult = _memory.WriteWords(request.Address, values);
274 if (!writeResult.IsSuccess)
275 {
276 return BuildErrorResponse(requestFrame, 0x2101);
277 }
278
279 ApplyAutoWordResponse(request.Address, values);
280 }
281
282 return BuildResponse(requestFrame, request.Command, 0, []);
283 }

다음을 참조함 : _memory, ApplyAutoWordResponse(), BuildErrorResponse(), BuildResponse(), Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.FinsRequest.IsBitAccess, Dreamine.PLC.Omron.Fins.Protocol.OmronFinsEndian.ReadInt16().

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

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

◆ TryParseRequest()

bool Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.TryParseRequest ( byte[] frame,
out FinsRequest request,
out string? errorMessage )
inlinestaticprivate

원시 FINS 요청 프레임의 명령·영역·주소·개수·데이터를 구문 분석합니다.

매개변수
frame구문 분석할 요청 프레임입니다.
request성공 시 구문 분석된 요청을 받습니다.
errorMessage실패 시 진단 메시지를 받습니다.
반환값
프레임이 유효하고 지원되는 메모리 영역을 사용하면 true입니다.

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

375 {
376 request = default;
377 errorMessage = null;
378
379 if (frame.Length < 18)
380 {
381 errorMessage = $"The FINS request frame is too short. Length={frame.Length}.";
382 return false;
383 }
384
385 var command = OmronFinsEndian.ReadUInt16(frame, 10);
386 var areaCode = frame[12];
387 var offset = OmronFinsEndian.ReadUInt16(frame, 13);
388 var bitOffset = frame[15];
389 var count = OmronFinsEndian.ReadUInt16(frame, 16);
390 var data = frame.Length > 18 ? frame[18..] : [];
391 var deviceType = OmronFinsMemoryAreaMapper.ToDeviceType(areaCode);
392
393 if (deviceType == PlcDeviceType.Unknown)
394 {
395 errorMessage = $"Unsupported FINS memory area code: 0x{areaCode:X2}.";
396 return false;
397 }
398
399 request = new FinsRequest(
400 command,
401 areaCode,
402 new PlcAddress(deviceType, offset, OmronFinsMemoryAreaMapper.IsBitArea(areaCode) ? bitOffset : null),
403 count,
404 data);
405 return true;
406 }

다음을 참조함 : Dreamine.PLC.Omron.Fins.Devices.OmronFinsMemoryAreaMapper.IsBitArea(), Dreamine.PLC.Omron.Fins.Protocol.OmronFinsEndian.ReadUInt16(), Dreamine.PLC.Omron.Fins.Devices.OmronFinsMemoryAreaMapper.ToDeviceType().

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

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

멤버 데이터 문서화

◆ _memory

readonly InMemoryPlcMemory Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol._memory
private

memory 값을 보관합니다.

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

다음에 의해서 참조됨 : ApplyAutoWordResponse(), HandleRead(), HandleWrite(), OmronFinsSimulatorProtocol().

◆ _options

readonly OmronFinsSimulatorServerOptions Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol._options
private

options 값을 보관합니다.

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

다음에 의해서 참조됨 : ApplyAutoWordResponse(), OmronFinsSimulatorProtocol().

이벤트 문서화

◆ StatusChanged

EventHandler<string>? Dreamine.PLC.Omron.Fins.Simulation.OmronFinsSimulatorProtocol.StatusChanged

시뮬레이터 상태 또는 자동 응답 정보가 변경될 때 발생합니다.

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

다음에 의해서 참조됨 : ApplyAutoWordResponse(), HandleRequest().


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