using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.IO; using System.Collections.Concurrent; using System.Threading; using System.Timers; namespace BEMSDataGateway { public partial class Form1 : Form { IcosComm iCosSocket; //iCos 통신클래스 LogFileCreate LFC = new LogFileCreate(); //로그 기록 파일 My_TimerThread MTT = new My_TimerThread(); System.Timers.Timer timer_NetStat = new System.Timers.Timer(); Parsing PS = new Parsing(); string szICOS_IP; //iCos server 주소 string szICOS_ID; //iCos server ID string szICOS_PW; //iCos server Password string szDB_IP; //iCos 프로젝트 DB 주소 string szDB_NAME; //iCos 프로젝트 DB 이름 string szDB_ID; //iCos 프로젝트 DB 접속 ID string szDB_PW; //iCos 프로젝트 DB 접속 비밀번호 int nDB_TYPE = 1; //iCos 프로젝트 DB 종류 (0:MDB, 1:MS-SQL) public bool bConnect; public void CommResponse(string userid, int nType, int nSubType, Object obj) //iCOS 응답처리를 위한 함수 { if (nType == 6) { if (nSubType == 2) { iCosLogInResponse _packet = (iCosLogInResponse)obj; string errMsg; if (_packet.nResult == 3) //로그인 성공 { LFC.Log("iCOS 4 서버에 로그인 성공" + Environment.NewLine); } else //로그인 실패 { if (_packet.nResult == 0) errMsg = "DB Error"; else if (_packet.nResult == 1) errMsg = "Password Error"; else if (_packet.nResult == 2) errMsg = "ID Error"; else errMsg = "Other Errors"; LFC.Log("[Form] iCOS4 서버 연결실패 : " + errMsg + Environment.NewLine); } } } else if (nType == 4) //알람 { if (nSubType == 11) { //알람이 발생하면 여기로 들어온다. } else if (nSubType == 9) //ALARM_ACK_FROM_SERVER { //서버로 부터 알람에 대한 인지가 발생하면 여기로 들어온다. } else if (nSubType == 16) //ALARM_CHACK_ALL_PROCESS_FROM_SERVER { //서버로 부터 모든 알람에 대한 인지가 발생하면 여기로 들어온다. } else { // 그외에 알람관련 정보를 받으면 여기로 들어온다. } } else if (nType == 99) { //iCos 서버와의 접속이 끊기고 연결오류 발생시 여기로 들어온다. LFC.Log("[Form]iCos4 서버에 의해서 소켓 연결이 끊어졌습니다" + Environment.NewLine); ; } } public bool iCos4ConnectandLogin(string address, string id, string password)// iCOS4 네트워크 상태 파악 함수, 0 : 연결 안됨, 1: 정상 상태 { bool bRet = false; if (iCosSocket.Connect(address, 6000, id, password)) //iCOS 소켓 연결 { iCosSocket.IcosLogin(id, password); //iCOS 로그인 bRet = true; } else { iCosSocket.Disconnect(id); //iCOS 소켓 연결 해제 } return bRet; } public string iCos4Connect() //iCOS 연결 함수 { string strRet = ""; string Result_Connect_iCos = ""; Readini Ri = new Readini(); Ri.ReadData(); // ini의 설정값을 불러옴. szICOS_IP = Ri.IP1; szICOS_ID = Ri.ICOS_ID; szICOS_PW = Ri.ICOS_PASSWORD; nDB_TYPE = Convert.ToInt32(Ri.ICOSDB_TYPE); szDB_IP = Ri.ICOSDB_LOC; szDB_NAME = Ri.ICOSDB_NAME; szDB_ID = Ri.ICOSDB_ID; szDB_PW = Ri.ICOSDB_PASSWORD; try { if (!iCosSocket.InitTagAddress(nDB_TYPE, szDB_IP, szDB_NAME, szDB_ID, szDB_PW)) // iCOS DB 정보 가져옴 { if (!iCosSocket.InitTagAddress(nDB_TYPE, szDB_IP, szDB_NAME, szDB_ID, szDB_PW)) //1차 실패시, iCOS DB 정보 다시 가져옴 { Result_Connect_iCos = "iCOS 관제점 DB정보 설정 최종실패"; return Result_Connect_iCos; } } iCosSocket.InitThread(); // iCoS 연결관리 bool bRet = iCos4ConnectandLogin(szICOS_IP, szICOS_ID, szICOS_PW); if (bRet == false) { LogTxt.AppendText(Convert.ToString(DateTime.Now) + " iCOS 접속 실패" + Environment.NewLine); LFC.Log("iCOS 접속 실패"); Result_Connect_iCos = "FAIL"; } else { strRet = bRet.ToString(); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " iCOS 접속 시작" + Environment.NewLine); LFC.Log("iCOS 접속 시작"); Result_Connect_iCos = "SUCCESS"; } } catch (Exception) { Result_Connect_iCos = "FAIL"; } LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); return Result_Connect_iCos; } string[] ReturnTag = new string[2]; public void ReadTag() //iCOS 태그 등록 함수 { int i; Parsing Ps = new Parsing(); Control_Point_Group CPG = new Control_Point_Group(); ReturnTag = Ps.TagParsing(); i = iCosSocket.IcosRegTag(szICOS_ID, Convert.ToInt32(ReturnTag[1]), ReturnTag[0]);//Tag 등록 if (i == 1) { LFC.Log("관제점 등록 완료 " + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 관제점 등록 완료" + Environment.NewLine); } else { LFC.Log("[Form] 관제점 등록 실패" + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 관제점 등록 실패" + Environment.NewLine); } PS.setIcosSocket(iCosSocket); CPG.setIcosSocket(iCosSocket); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } System.Timers.Timer timer2 = new System.Timers.Timer(); public int UnReg()//iCOS 태그 해제 함수 { int i; ReturnTag = PS.TagParsing(); Control_Point_Group CPG = new Control_Point_Group(); i = iCosSocket.IcosUnregTag(szICOS_ID, Convert.ToInt32(ReturnTag[1]), ReturnTag[0]);//태그 등록 해제 PS.setIcosSocket(iCosSocket); CPG.setIcosSocket(iCosSocket); if (i == 1) { LFC.Log("[Form] 관제점 해제 완료" + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 관제점 해제 완료" + Environment.NewLine); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); return 1; } else { LFC.Log("[Form] 관제점 해제 실패" + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 관제점 해제 실패" + Environment.NewLine); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); return 0; } } public Form1() //Form 함수 { InitializeComponent(); //Form 초기화 iCosSocket = new IcosComm(); // iCos 통신클래스와 연동을 위한 딜리게이트 함수설정 iCosSocket.iCosResponse += new IcosComm.iCosCallback(CommResponse); Timer_netStat(); //iCOS 네트워크 연결 확인 함수 } private void Form1_Load(object sender, EventArgs e) { ProStopBtn.Enabled = false; PointSetBtn.Enabled = false; PointUnRegBtn.Enabled = false; ProStartBtn.Enabled = false; ProStopBtn.Enabled = false; AllValueCheck_btn.Enabled = false; RequestValue_btn.Enabled = false; Shown += Form_Shown; } public void Timer_netStat() //iCOS 연결 상태 확인 쓰레드 동작 함수 { timer_NetStat.Interval = 3000; timer_NetStat.Elapsed += new ElapsedEventHandler(net_state_Thread); timer_NetStat.Start(); } bool changed = false; public void net_state_Thread(object sender, ElapsedEventArgs e) //iCOS 연결 상태 확인 쓰레드 함수 { int nNet; string strRet; string connectstate = ""; try { nNet = Convert.ToInt32(iCosSocket.GetConnectionStatus(szICOS_ID)); strRet = nNet.ToString(); if (strRet == "1") { if (changed == false) { connectstate = "ICOS 통신중"; } else { Wirte_logtxt(Convert.ToString(DateTime.Now) + " ICOS와 통신 연결" + Environment.NewLine); Wirte_btn(PointSetBtn); } changed = false; } else { connectstate = "ICOS 통신끊김"; changed = true; Wirte_logtxt(Convert.ToString(DateTime.Now) + " ICOS와 통신 끊김" + Environment.NewLine); } Wirte_Net_Stat(connectstate); // 통신상태 체크, 딜리게이트 활용: 스레드를 통한 Form UI 변경시 필요 } catch (Exception E) { LFC.Log("[Form] net_state_Thread 오류 : " + E + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " [Form] net_state_Thread 오류 : " + E + Environment.NewLine); } } private delegate void myDelegate_button(Button btn); private void Wirte_btn(Button btn) //통신상태 변화 Form text box에 적용 함수 { try { if (PointSetBtn.InvokeRequired) { myDelegate_button d = new myDelegate_button(Wirte_btn); this.Invoke(d, btn); } else { btn.PerformClick(); } } catch (Exception E) { LFC.Log("[Form] Wirte_btn 오류 : " + E + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " [Form] Wirte_btn 오류 : " + E + Environment.NewLine); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } } private delegate void myDelegate_error(string theValue); private void Wirte_logtxt(string theValue) //통신상태 변화 Form text box에 적용 함수 { try { if (this.LogTxt.InvokeRequired) { myDelegate_error d = new myDelegate_error(Wirte_logtxt); this.Invoke(d, new object[] { theValue }); } else { this.LogTxt.AppendText(theValue); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } } catch (Exception E) { LFC.Log("[Form] Wirte_logtxt 오류 : " + E + Environment.NewLine); } } private delegate void myDelegate_state(string theValue); private void Wirte_Net_Stat(string theValue) //통신상태 변화 Form text box에 적용 함수 { try { if (this.Net_Stat.InvokeRequired) { myDelegate_state d = new myDelegate_state(Wirte_Net_Stat); this.Invoke(d, new object[] { theValue }); } else { this.Net_Stat.Text = theValue; } } catch (Exception E) { LFC.Log("[Form] Wirte_Net_Stat 오류 : " + E + Environment.NewLine); } } private void Form_Shown(object sender, EventArgs e) //Form 나타날때, 동작 함수 { string ReturnValue = iCos4Connect(); if (ReturnValue == "SUCCESS") { LFC.Log("iCOS 접속 성공"); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " iCOS 접속 성공" + Environment.NewLine); EndTxt.Clear(); StartTxt.Text = Convert.ToString(DateTime.Now); Conn_iCos_Btn.Enabled = false; ProStartBtn.Enabled = false; ProStopBtn.Enabled = true; PointSetBtn.Enabled = true; PointUnRegBtn.Enabled = false; FileSettingBtn.Enabled = false; FileMatchBtn.Enabled = false; FileExpBtn.Enabled = false; } else { LogTxt.AppendText(Convert.ToString(DateTime.Now) + " iCOS 접속 실패" + Environment.NewLine); LFC.Log("iCOS 접속 실패" + Environment.NewLine); } LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } private void ProStartBtn_Click(object sender, EventArgs e) //시작 버튼 클릭 함수 { FolderBrowserDialog(); if (toolStripStatusLabel1.Text != "") { try { EndTxt.Clear(); StartTxt.Text = Convert.ToString(DateTime.Now); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 프로그램 시작" + Environment.NewLine); LFC.Log("프로그램 시작" + Environment.NewLine); ProStartBtn.Enabled = false; // 시작버튼 비활성화. ProStopBtn.Enabled = true; FileSettingBtn.Enabled = false; FileMatchBtn.Enabled = false; FileExpBtn.Enabled = false; AllValueCheck_btn.Enabled = true; RequestValue_btn.Enabled = true; FirstCheck FC = new FirstCheck(); FC.Check_DailyData(); // Hour, Daily 테이블 삽입 및 업데이트 OneMinute_Insert OMI = new OneMinute_Insert(); OMI.Today_PeakMinMax(); OMI.Year_PeakMinMax(); MTT.timer2start(); } catch (Exception eProStart) { LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 프로그램 DB 접속 오류 : " + eProStart + Environment.NewLine); LFC.Log("[Form] 프로그램 DB 접속 오류 : " + eProStart + Environment.NewLine); } } else { MessageBox.Show("경로를 설정해주세요"); } LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } private void ProStopBtn_Click(object sender, EventArgs e) //스탑 버튼 클릭 함수 { try { ProStartBtn.Enabled = true; ProStopBtn.Enabled = false; AllValueCheck_btn.Enabled = false; RequestValue_btn.Enabled = false; FileSettingBtn.Enabled = true; FileMatchBtn.Enabled = true; FileExpBtn.Enabled = true; EndTxt.Text = Convert.ToString(DateTime.Now); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 프로그램 중단" + Environment.NewLine); LFC.Log("프로그램 중단" + Environment.NewLine); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); MTT.timer2Stop(); } catch (Exception ex) { LFC.Log("프로그램 중단 오류 : " + ex + Environment.NewLine); } } private void ProSetBtn_Click(object sender, EventArgs e) //접속 설정 클릭 함수 { SettingForm SF = new SettingForm(); SF.ShowDialog(); } private void ProPathBtn_Click(object sender, EventArgs e)//프로젝트 설정 클릭 함수 { System.Diagnostics.Process.Start("explorer.exe", Environment.CurrentDirectory); } /// /// 셋팅파일 불러오기 버튼 /// /// /// private void FileSettingBtn_Click(object sender, EventArgs e) { string FSBLocation = Environment.CurrentDirectory + "\\Login.ini"; try { System.Diagnostics.Process.Start(FSBLocation); } catch { FileError(FSBLocation); } } /// /// 매칭파일 불러오기 버튼 /// /// /// private void FileMatchBtn_Click(object sender, EventArgs e) { string FSBLocation = Environment.CurrentDirectory + "\\SettingFile.csv"; try { System.Diagnostics.Process.Start(FSBLocation); } catch { FileError(FSBLocation); } } /// /// 수식파일 불러오기 버튼 /// /// /// private void FileExpBtn_Click(object sender, EventArgs e) { string FSBLocation = Environment.CurrentDirectory + "\\Expression.csv"; try { System.Diagnostics.Process.Start(FSBLocation); } catch { FileError(FSBLocation); } } public void FileError(string Error) // 파일 읽어오기 에러 확인 삼수 { if ((!Error.Contains("Login.ini")) || (!Error.Contains("expression.csv")) || (!Error.Contains("Matching.csv"))) { MessageBox.Show("파일을 찾을 수 없음"); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 파일을 찾을 수 없음" + Environment.NewLine); LFC.Log("파일을 찾을 수 없음 : " + Environment.NewLine); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } } public void FolderBrowserDialog() { toolStripStatusLabel1.Text = Environment.CurrentDirectory; LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 경로 설정 완료" + Environment.NewLine); LogTxt.AppendText(toolStripStatusLabel1 + Environment.NewLine); LFC.Log("경로설정완료"); LFC.Log("경로 : " + toolStripStatusLabel1 + Environment.NewLine); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } private void EraseLog_Click(object sender, EventArgs e) // 로그 박스에 로그 기록 삭제 함수 { LogTxt.Clear(); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } private void Form_FormClosing(object sender, FormClosingEventArgs e)// 프로그램 종료 이벤트 { if (MessageBox.Show("프로그램을 종료하시겠습니까?", "종료", MessageBoxButtons.YesNo) == DialogResult.Yes) { LFC.Log("사용자에 의해 프로그램이 종료되었습니다." + Environment.NewLine); MTT.timer2Stop(); Dispose(); } else { LFC.Log("사용자에 의해 프로그램 종료가 취소되었습니다."); e.Cancel = true; return; } } private void PointSetBtn_Click(object sender, EventArgs e) //관제점 등록 함수 { int nNet; string strRet; nNet = Convert.ToInt32(iCosSocket.GetConnectionStatus(szICOS_ID)); strRet = nNet.ToString(); if (strRet == "1") { ReadTag(); //관제점 등록 AllValueCheck_btn.Enabled = true; RequestValue_btn.Enabled = true; ProStartBtn.Enabled = true; PointUnRegBtn.Enabled = true; } else { LFC.Log("관제점 등록 실패!!" + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 관제점 등록 실패!!" + Environment.NewLine); LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } } private void Conn_iCos_Btn_Click(object sender, EventArgs e) //iCOS 연결 클릭 함수 { string ReturnValue = iCos4Connect(); //iCOS 연결 if (ReturnValue == "SUCCESS") { StartTxt.Text = Convert.ToString(DateTime.Now); EndTxt.Clear(); Conn_iCos_Btn.Enabled = false; ProStartBtn.Enabled = false; ProStopBtn.Enabled = true; PointSetBtn.Enabled = true; PointUnRegBtn.Enabled = true; LFC.Log("iCOS 접속 성공" + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " iCOS 접속 성공" + Environment.NewLine); } else { LFC.Log("iCOS 접속 실패" + Environment.NewLine); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " iCOS 접속 실패" + Environment.NewLine); } LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } private void PointUnRegBtn_Click(object sender, EventArgs e) //관제점 해제 클릭 함수 { int i; i = UnReg(); //관제점 해제 if (i == 1) { PointUnRegBtn.Enabled = false; AllValueCheck_btn.Enabled = false; RequestValue_btn.Enabled = false; ProStartBtn.Enabled = false; } else { PointUnRegBtn.Enabled = true; } } private void Btn_TagSetFile_Click(object sender, EventArgs e) //TagSetFile 클릭 함수, TagSetFile 파일 생성 { Creating_Setting_File CSF = new Creating_Setting_File(); CSF.Create_Point_File(); } private void Btn_SettingFile_Click(object sender, EventArgs e)//SettingFile 클릭 함수, SettingFile 파일 생성 { Creating_Setting_File CSF = new Creating_Setting_File(); CSF.Create_Setting_Point_File(); } private void AllValueCheck_btn_Click(object sender, EventArgs e)//일괄 출력 클릭 함수 { string[] sArray = File.ReadAllLines("TagSetFile.csv", Encoding.Default); LogTxt.AppendText("*** 현재 시간 : " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ***" + Environment.NewLine); LFC.Log("*** 현재 시간 : " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ***" + Environment.NewLine); try { for (int i = 0; i < sArray.Length; i++) { string[] tmp = sArray[i].Split(','); // tmp[0] = index, tmp[1] = Tag명. LogTxt.AppendText('"' + tmp[1] + '"' + " 의 값 : " + iCosSocket.IcosGetTagValue(tmp[1]) + Environment.NewLine); LFC.Log('"' + tmp[1] + '"' + " 의 값 : " + iCosSocket.IcosGetTagValue(tmp[1])); } LogTxt.AppendText("**********************************" + Environment.NewLine); LFC.Log("**********************************" + Environment.NewLine); } catch (Exception er) { MessageBox.Show("오류 발생"); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 오류 발생 : " + er); LFC.Log("오류 발생 = " + er); } LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } private void RequestValue_btn_Click(object sender, EventArgs e) //특정 값 출력 함수 { if (RequestValue.Text != "") { LogTxt.AppendText("*** 현재 시간 : " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ***" + Environment.NewLine); LFC.Log("*** 현재 시간 : " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ***" + Environment.NewLine); try { string tmp = RequestValue.Text; //태그값 LogTxt.AppendText('"' + tmp + '"' + " 의 값 : " + iCosSocket.IcosGetTagValue(tmp) + Environment.NewLine); LogTxt.AppendText("**********************************" + Environment.NewLine); LFC.Log(tmp + " 의 값 : " + iCosSocket.IcosGetTagValue(tmp) + Environment.NewLine); LFC.Log("**********************************" + Environment.NewLine); } catch (Exception er) { MessageBox.Show("오류 발생"); LogTxt.AppendText(Convert.ToString(DateTime.Now) + " 오류 발생 : " + er); LFC.Log("오류 발생 : " + er); } } else { MessageBox.Show("확인 값이 없습니다."); return; } LogTxt.Select(LogTxt.Text.Length, 0); LogTxt.ScrollToCaret(); } private void RequestValue_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 8) //백스페이스할때, 데이터 삭제 { if (RequestValue.Text.Length != 0) { RequestValue.Text = RequestValue.Text.Substring(0, RequestValue.Text.Length - 1); RequestValue.Select(RequestValue.Text.Length, 0); e.Handled = true; } else { e.Handled = true; } } else { RequestValue.Select(RequestValue.Text.Length, 0); //현재 데이터 뒤로 포커스 이동 } } private void RequestValue_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.Control && e.KeyCode == Keys.A) //Ctrl + A 동작 { ((TextBox)sender).SelectAll(); } if (e.Control && e.KeyCode == Keys.C) //Ctrl + C 동작 { ((TextBox)sender).Copy(); } if (e.Control && e.KeyCode == Keys.V) //Ctrl + V 동작 { ((TextBox)sender).Paste(); } if (e.Control && e.KeyCode == Keys.X) //Ctrl + X 동작 { ((TextBox)sender).Cut(); } } private void DBAddressTxt_TextChanged(object sender, EventArgs e) { } private void DBNameTxt_TextChanged(object sender, EventArgs e) { } } }