Files
vms2016_kadisp/Sub/arMasterK/Project/Parser.cs

231 lines
9.8 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace arDev
{
public partial class MasterK
{
public sRecvMessage Parse_RecvBuffer(byte[] buffer)
{
sRecvMessage frame = new sRecvMessage();
frame.Clear();
frame.Message = string.Empty;
if(buffer==null)
{
frame.Message = "null buffer";
return frame;
}
frame.FullString = System.Text.Encoding.Default.GetString(buffer);
if (buffer == null || buffer.Length < 5)
{
frame.Message = "No Buffer";
errorMessage = frame.Message;
return frame;
}
//buffer copy
frame.Buffer = new byte[buffer.Length];
buffer.CopyTo(frame.Buffer, 0);
if ((buffer[0] != 0x06 && buffer[0] != 0x15) || buffer[buffer.Length - 1] != 0x03)
{
frame.Message = "No STX,ETX";
errorMessage = frame.Message;
return frame;
}
try
{
frame.checksum = new byte[2];
frame.isCSError = false;// !CheckCrc(buffer);
frame.Device = System.Text.Encoding.Default.GetString(buffer, 1, 2);
frame.Command = (char)buffer[3];
frame.CmdType = System.Text.Encoding.Default.GetString(buffer, 4, 2);
//쓰기명령은 데이터가 없다.
if (frame.Command == 'W')
{
frame.BlockCount = 0;
frame.DataLen = 0;
frame.Data = null;
}
else
{
if (!frame.isNAK)
{
frame.BlockCount = Convert.ToInt32(System.Text.Encoding.Default.GetString(buffer, 6, 2), 16);
frame.DataLen = Convert.ToInt32(System.Text.Encoding.Default.GetString(buffer, 8, 2), 16);
int stringDataLen = frame.BlockCount * frame.DataLen * 2;
if (frame.FullString.Length < stringDataLen + 10)
{
frame.BlockCount = 0;
frame.Data = string.Empty;
errorMessage = "Frame length Error:" + frame.FullString;
}
else
{
frame.Data = frame.FullString.Substring(10, stringDataLen); //, 10, DataBufferLen);
}
}
}
} catch(Exception ex) //180706
{
frame.BlockCount = 0;
errorMessage = ex.Message;
}
if (frame.isError && errorMessage == "") errorMessage = "Recvbuffer Has Error";
return frame;
}
public sSendMessage Parse_SendBuffer(byte[] buffer)
{
sSendMessage msg = new sSendMessage();
msg.Clear();
msg.Message = string.Empty;
if (buffer == null || buffer.Length < 5)
{
msg.Message = "No Buffer";
errorMessage = msg.Message;
return msg;
}
//buffer copy
msg.Buffer = new byte[buffer.Length];
msg.Strbuffer = System.Text.Encoding.Default.GetString(buffer);
buffer.CopyTo(msg.Buffer, 0);
if ((buffer[0] != wSTX) || buffer[buffer.Length - 1] != wETX)
{
msg.Message = "No STX,ETX";
errorMessage = msg.Message;
return msg;
}
msg.checksum = new byte[2];
msg.isCSError = false;// !CheckCrc(buffer);
msg.Device = System.Text.Encoding.Default.GetString(buffer, 1, 2);
msg.Command = (char)buffer[3];
if (msg.Command == 'R')
{
msg.CmdType = msg.Strbuffer.Substring(4, 2);
msg.DeviceLength = int.Parse(msg.Strbuffer.Substring( 6, 2));
msg.VarName = msg.Strbuffer.Substring( 8, msg.DeviceLength);
msg.DataLen = int.Parse(msg.Strbuffer.Substring( 8 + msg.DeviceLength, 2));
} else if (msg.Command == 'W')
{
msg.CmdType = System.Text.Encoding.Default.GetString(buffer, 4, 2);
if(msg.CmdType == "SB")
{
//블록수가 없다.
msg.NumberofBlock = 0;
msg.DeviceLength = int.Parse(msg.Strbuffer.Substring(6, 2));
msg.VarName = msg.Strbuffer.Substring(8, msg.DeviceLength);
msg.DataLen = Convert.ToByte(msg.Strbuffer.Substring(8 + msg.DeviceLength, 2),16);
int remain = msg.Strbuffer.Length - 2 - 10 - msg.DeviceLength+1;
msg.Data = msg.Strbuffer.Substring(10 + msg.DeviceLength, remain);
}
else
{
msg.NumberofBlock = int.Parse(msg.Strbuffer.Substring(6, 2));
msg.DeviceLength = int.Parse(msg.Strbuffer.Substring(8, 2));
msg.VarName = msg.Strbuffer.Substring(10, msg.DeviceLength);
msg.Data = msg.Strbuffer.Substring(10 + msg.DeviceLength, 2);
msg.DataLen = (int)(msg.Data.Length / 2.0);
}
}
return msg;
}
/// <summary>
/// 수신된 데이터를 분석하고 관련 메세지를 생성합니다.
/// </summary>
/// <param name="opCode"></param>
/// <param name="dataBuffer"></param>
[Description("")]
protected void Run_RelayPortData(ref sRecvMessage message)
{
if (message.isNAK) return; //req nak process
if (message.Command == 'R')
{
if (message.CmdType == "SB")
{
var Port = lastSendMessage.VarName.Substring(1, 1);
var DataType = lastSendMessage.VarName.Substring(2, 1);
//int DataLen = 0;
//if (DataType == "W") DataLen = 16;
switch (Port)
{
case "P": //relay
//들어온값이 16진수 문자형태이므로 숫자로 변경
var InBufferStrH = message.Data.Substring(0, 8);
var InBufferStrL = message.Data.Substring(8, 8);
var OtBufferStrH = message.Data.Substring(16, 8);
var OtBufferStrL = message.Data.Substring(24, 8);
Int32 numvalueHI = Convert.ToInt32(InBufferStrL, 16);
Int32 numvalueLI = Convert.ToInt32(InBufferStrH, 16);
Int32 numvalueHO = Convert.ToInt32(OtBufferStrL, 16);
Int32 numvalueLO = Convert.ToInt32(OtBufferStrH, 16);
var bufHI = BitConverter.GetBytes(numvalueHI).ToArray();
var bufLI = BitConverter.GetBytes(numvalueLI).ToArray();
var bufHO = BitConverter.GetBytes(numvalueHO).ToArray();
var bufLO = BitConverter.GetBytes(numvalueLO).ToArray();
System.Collections.BitArray b = new System.Collections.BitArray(new byte[] { bufLI[2], bufLI[3], bufLI[0], bufLI[1] });
for (int i = 0; i < b.Length; i++)
{
this._valueI[i] = b.Get(i);
if (OldvalueI[i] != this._valueI[i])
{
try
{
if (IOValueChanged != null)
IOValueChanged(this, new IOValueEventArgs(eIOPINDIR.INPUT, i, OldvalueI[i], _valueI[i]));
}
catch (Exception ex)
{
if (IOErrorMessage != null)
IOErrorMessage(this, new MessageEventArgs(true, ex.Message));
}
this.OldvalueI[i] = this._valueI[i];
}
}
System.Collections.BitArray bO = new System.Collections.BitArray(new byte[] { bufLO[2], bufLO[3], bufLO[0], bufLO[1] });
for (int i = 0; i < bO.Length; i++)
{
this._valueO[i] = bO.Get(i);
if (OldvalueO[i] != this._valueO[i])
{
try
{
if (IOValueChanged != null)
IOValueChanged(this, new IOValueEventArgs(eIOPINDIR.OUTPUT, i, OldvalueO[i], _valueO[i]));
}
catch (Exception ex)
{
if (IOErrorMessage != null)
IOErrorMessage(this, new MessageEventArgs(true, ex.Message));
}
this.OldvalueO[i] = this._valueO[i];
}
}
break;
}
}
}
}
}
}