Dreamine.PLC.Omron.Fins 1.0.1
Dreamine.PLC.Omron.Fins 산업 자동화 및 I/O 기능을 제공합니다.
로딩중...
검색중...
일치하는것 없음
OmronFinsTcpPacket.cs
이 파일의 문서화 페이지로 가기
1using System.Text;
2
4
13public static class OmronFinsTcpPacket
14{
23 private static readonly byte[] Signature = Encoding.ASCII.GetBytes("FINS");
24
57 public static byte[] Wrap(IReadOnlyList<byte> finsFrame)
58 {
59 ArgumentNullException.ThrowIfNull(finsFrame);
60
61 var packet = new byte[16 + finsFrame.Count];
62 Buffer.BlockCopy(Signature, 0, packet, 0, Signature.Length);
63 OmronFinsEndian.WriteInt32(packet, 4, 8 + finsFrame.Count);
64 OmronFinsEndian.WriteInt32(packet, 8, 2);
65 OmronFinsEndian.WriteInt32(packet, 12, 0);
66
67 for (var index = 0; index < finsFrame.Count; index++)
68 {
69 packet[16 + index] = finsFrame[index];
70 }
71
72 return packet;
73 }
74
107 public static byte[] Extract(ReadOnlySpan<byte> packet)
108 {
109 if (packet.Length < 16)
110 {
111 throw new InvalidOperationException($"FINS/TCP packet is too short. Length={packet.Length}.");
112 }
113
114 if (packet[0] != Signature[0] || packet[1] != Signature[1] || packet[2] != Signature[2] || packet[3] != Signature[3])
115 {
116 throw new InvalidOperationException("Invalid FINS/TCP signature.");
117 }
118
119 var errorCode = OmronFinsEndian.ReadInt32(packet, 12);
120 if (errorCode != 0)
121 {
122 throw new InvalidOperationException($"FINS/TCP error: 0x{errorCode:X8}.");
123 }
124
125 return packet[16..].ToArray();
126 }
127}
static void WriteInt32(Span< byte > buffer, int offset, int value)
static int ReadInt32(ReadOnlySpan< byte > buffer, int offset)
static byte[] Extract(ReadOnlySpan< byte > packet)
static byte[] Wrap(IReadOnlyList< byte > finsFrame)