C# SECS 메세지를 XML 구조로 저장및 읽기 예제
2021. 8. 10. 10:49ㆍ프로그래밍
반응형
값이 저장된 SECS 메세지를 저장하고 다시 읽기 위한 기능입니다.
테스트나 시뮬레이션 목적을 위해 필요한 기능입니다.
참고바랍니다.
class clsXml_Manager
{
string CurrSF = string.Empty;
static int conIdx = 0;
public static bool LodeSMLData()
{
try
{
XmlDocument xdoc = new XmlDocument();
//string Path = System.IO.Directory.GetCurrentDirectory();
//string Path = Directory.GetParent(Environment.CurrentDirectory).Parent.FullName;
// XML 데이타를 파일에서 로드
//xdoc.Load(Path + @"\smdtest.xml");
if (File.Exists(clsDataManager.sSMLPath) == true)
{
xdoc.Load(clsDataManager.sSMLPath);
// 특정 노드들을 필터링
XmlNodeList nodes = xdoc.SelectNodes("/PCOM_MSG_BASE");
foreach (XmlNode emp in nodes)
{
foreach (XmlNode child in emp.ChildNodes)
{
string AttribName = child.Name;
if (AttribName.CompareTo("SECS_MSG") == 0)
{
if (child.ChildNodes.Count >= 0)
{
if (!clsDataManager.MsgStruct.ContainsKey(child.Attributes["Name"].Value))
clsDataManager.MsgStruct.Add(child.Attributes["Name"].Value, child.ChildNodes);
else
{
conIdx++;
clsDataManager.MsgStruct.Add(child.Attributes["Name"].Value + "_" + conIdx, child.ChildNodes);
}
}
}
}
}
return true;
}
else
return false;
//saveXml();
}
catch (Exception)
{
return false;
}
}
public static int Check_Msg(int nMsgID, short Stream, short Function)
{
int rs = 0;
string Key = string.Empty;
bool sflag = false;
bool fflag = false;
try
{
Key = Stream + "F" + Function;
foreach (KeyValuePair<string, XmlNodeList> dic in clsDataManager.MsgStruct)
{
string[] sTemp = dic.Key.Split('F');
if (Stream.ToString().CompareTo(sTemp[0]) == 0)
sflag = true;
}
if (!sflag)
return (int)ValidationCode.S9F3UnrecognizedStream;
foreach (KeyValuePair<string, XmlNodeList> dic in clsDataManager.MsgStruct)
{
if(dic.Key.Contains(Key))
{
rs = RekursivExport(nMsgID, dic.Value, 0);
if (rs == 0)
{
fflag = true;
break;
}
}
}
if (!fflag)
return (int)ValidationCode.S9F5UnrecognizedFunction;
return rs;
}
catch (Exception ex)
{
return -3;
}
}
private static int RekursivExport(int nMsgID, XmlNodeList Collection, int Lcnt)
{
clsSECSMessage csm;
string btemp = string.Empty;
int rs = 0;
try
{
//MsgID 존재 여부 Check
if (clsDataManager.MessageList.ContainsKey(nMsgID))
csm = clsDataManager.MessageList[nMsgID];
else return (short)ErrCode.MsgIdNotExist;
csm.CheckIndex = 0;
for (int loop = 0; loop <= Lcnt; loop++)
{
foreach (XmlNode child in Collection)
{
btemp = Convert.ToString(csm.dataBuffer[csm.CheckIndex], 2).PadLeft(8, '0');
//Item 매칭 여부 Check
FormatCode FcTemp = (FormatCode)((int)((XmlCode)Enum.Parse(typeof(XmlCode), child.Name, true)));
if (btemp.Substring(0, 6) != StringEnum.GetStringValue(FcTemp))
{
return (int)ValidationCode.S9F7IllegalData;
}
int LengthByte = Convert.ToInt32(btemp.Substring(6, 2), 2);
int nLen = clsMSG_PARSE.getItemCnt(csm.dataBuffer, LengthByte, csm.CheckIndex);
csm.CheckIndex = csm.CheckIndex + 1; //ItemType 만큼의 바이트를 시프트 한다.
//3f101로 nCnt Test
if (child.Name.CompareTo("L") == 0)
{
csm.CheckIndex = csm.CheckIndex + LengthByte;
if (child.Attributes["Count"].Value.CompareTo("n") == 0)
{
rs = RekursivExport(nMsgID, child.ChildNodes, nLen - 1);
if (rs < 0)
return rs;
}
else if (child.Attributes["Count"].Value.CompareTo("0") != 0)
{
rs = RekursivExport(nMsgID, child.ChildNodes, 0);
if (rs < 0)
return rs;
}
else
{
if (nLen != 0)
{
return (int)ValidationCode.S9F7IllegalData;
}
}
}
else
{
int ByteCnt = GetByteCnt((XmlCode)Enum.Parse(typeof(XmlCode), child.Name, true));
if (nLen == Convert.ToInt32(child.Attributes["Count"].Value) * ByteCnt)
{
csm.CheckIndex = csm.CheckIndex + LengthByte + nLen;
}
else
{
return (int)ValidationCode.S9F11DataTooLong;
}
}
}
}
return rs;
}
catch (Exception ex)
{
return (int)ValidationCode.S9F5UnrecognizedFunction;
}
}
private static int GetByteCnt(XmlCode ItemType)
{
int rs = 0;
switch(ItemType)
{
case XmlCode.A:
case XmlCode.B:
case XmlCode.BL:
case XmlCode.I1:
case XmlCode.J:
case XmlCode.U1:
rs = 1;
break;
case XmlCode.F4:
case XmlCode.I4:
case XmlCode.U4:
rs = 4;
break;
case XmlCode.F8:
case XmlCode.I8:
case XmlCode.U8:
rs = 8;
break;
case XmlCode.I2:
case XmlCode.U2:
rs = 2;
break;
}
return rs;
}
}
반응형
'프로그래밍' 카테고리의 다른 글
Port 개체등록 및 가져오기 방법 예제 (1) | 2021.08.20 |
---|---|
C# 프린터 관련 잡다한 메소드 (1) | 2021.08.16 |
C# SECS 타임아웃 처리를 위한 델리게이터 예제 (1) | 2021.08.10 |
C# SECS T3 타임아웃 처리 예제 (1) | 2021.08.10 |
C# SECS 메세지 생성 및 S9 메세지 처리 예제 (2) | 2021.08.10 |