231 lines
9.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|