public static PLCManager Get_PM() { if (PM == null) { PM = new PLCManager(); } return(PM); }
/* 콤보박스로 디바이스 변경 필요시 * private void CB_SelectedIndexChanged(object sender, EventArgs e) * { * lock (obj) * { * * Device_Def.Device = CB.SelectedItem.ToString(); * } * } */ private void BtServer_Click(object sender, EventArgs e) { if (BtSrv.Text == "Server") { try { IP = txtIP.Text; UI_set.Connection_Live = true; server = new CSocketServer(); PL = new PLCManager(); Thread t = new Thread(new ParameterizedThreadStart(PL.SocketInit)); Thread gr = new Thread(RefreshDisplayPLCData_Except_AddressColumn); if (!int.TryParse(txtPort.Text, out Port)) { MessageBox.Show("유효한 포트번호가 아닙니다."); } state = 1; PL.SocketLive = true; Control_Change(state); t.IsBackground = true; t.Start(IP); gr.Start(); } catch (Exception ev) { MessageBox.Show(ev.Message); } } else if (BtSrv.Text == "Server On") { Thread t = new Thread(new ParameterizedThreadStart(PL.SocketInit)); Thread gr = new Thread(RefreshDisplayPLCData_Except_AddressColumn); BtSrv.Text = "Server"; state = 0; server.CloseSockets(); txtPort.Enabled = true; txtIP.Enabled = true; MainForm.Text = "Waiting"; BtSrv.BackColor = SystemColors.Control; BtClient.Enabled = true; dataReset(); t.Abort(); gr.Abort(); PL.SocketLive = false; Gridreset(); } }
internal void RefreshDisplayPLCData_Except_AddressColumn() // 그리드뷰 Address Column 뺀, 나머지 새로고침 { while (state > 0) { UInt16[] vData = new UInt16[16]; UInt16[] TempByte = new UInt16[1]; //vdata[16]에 주소 ~ +16까지 배열값 읽어오기 vData = PLCManager.Read(iSelectedRegister, iSelectedAddress, 15); // 16 ==> 100 //row for (int i = 0; i < vData.Length; i++) { Grid[0, i + 0].Value = Device_Def.Device + (iSelectedAddress + i).ToString(); //column for (int j = 15; j >= 0; j--) { //첫번째줄 처음셀 부터 //읽어온 배열 내부값 & 쉘의 비트 변환값 == 같으면 1 Grid[16 - j, i].Value = (vData[i] & GetBitValue(j)) == GetBitValue(j) ? "1" : "0"; // 16개만 찍음 (D0 ~ D15) if (Grid[16 - j, i].Value.ToString() == ((vData[i] & GetBitValue(j)) == GetBitValue(j) ? "1" : "0")) { if (Grid[16 - j, i].Value.ToString() == "1") // 비트 데이터 1이면 { Grid[16 - j, i].Style.BackColor = Color.Aqua; // 활성화 색 } else { Grid[16 - j, i].Style.BackColor = Color.White; // 비 활성화 색 } } //if (m_VirtualPLC.SocketConnect != null) //{ // if (m_VirtualPLC.SocketConnect[i, 1] == 1) // { // gridControl_View[i + 1, 16].Style.BackColor = Color.Aqua; // } // else // { // gridControl_View[i + 1, 16].Style.BackColor = Color.White; // } //} } // j 바깥쪽 17~21 값 변환 //포트 번호 나열 Grid[0, 15].Value = "접속정보"; Grid[17, i].Value = ((vData[i] & 0xff00) / 256).ToString(); // HIGH Grid[18, i].Value = ((vData[i] & 0x00ff)).ToString(); // LOW Grid[19, i].Value = vData[i].ToString(); // ALL Grid[20, i].Value = ((char)((vData[i] & 0xff00) / 256)).ToString() + ((char)(vData[i] & 0x00ff)).ToString(); // ASCII } //서버일때 포트 번호 나열 for (int i = 0; i < UI_set.Enable_Client; i++) { Grid[i + 1, 15].Value = Port + i; Device_Def.ablePorts[i] = Port + i; } int a = 0; while (a < UI_set.Enable_Client) { } } }
internal void RefreshDisplayPLCData() // 그리드뷰 전체 셀 새로고침 { UInt16[] vData = new UInt16[16]; UInt16[] TempByte = new UInt16[1]; for (int i = 0; i < vData.Length; i++) { TempByte = PLCManager.Read(iSelectedRegister, iSelectedAddress + i, 1); ushort a = TempByte[0]; byte[] bb = BitConverter.GetBytes(a); for (int j = 0; j < bb.Length; j++) { BitArray b = new BitArray(new byte[] { bb[j] }); //BitArrayReverse(b); bb[j] = BitConvertToByte(b); } //Array.Reverse(b); TempByte[0] = BitConverter.ToUInt16(bb, 0); Array.Copy(TempByte, 0, vData, i, 1); } vData = PLCManager.Read(iSelectedRegister, iSelectedAddress, 15); // 16 ==> 100 for (int i = 0; i < vData.Length; i++) { Grid[0, i + 0].Value = Device_Def.Device + (iSelectedAddress + i).ToString(); // Address Column 관리 for (int j = 15; j >= 0; j--) { Grid[16 - j, i].Value = (vData[i] & GetBitValue(j)) == GetBitValue(j) ? "1" : "0"; // 16개만 찍음 (D0 ~ D15) if (Grid[16 - j, i].Value.ToString() == ((vData[i] & GetBitValue(j)) == GetBitValue(j) ? "1" : "0")) { if (Grid[16 - j, i].Value.ToString() == "1") // 비트 데이터 1이면 { Grid[16 - j, i].Style.BackColor = Color.Aqua; // 활성화 색 } else { Grid[16 - j, i].Style.BackColor = Color.White; // 비 활성화 색 } } //if (m_VirtualPLC.SocketConnect != null) //{ // if (m_VirtualPLC.SocketConnect[i, 1] == 1) // { // gridControl_View[i + 1, 16].Style.BackColor = Color.Aqua; // } // else // { // gridControl_View[i + 1, 16].Style.BackColor = Color.White; // } //} } Grid[17, i].Value = ((vData[i] & 0xff00) / 256).ToString(); // HIGH Grid[18, i].Value = ((vData[i] & 0x00ff)).ToString(); // LOW Grid[19, i].Value = vData[i].ToString(); // ALL Grid[20, i].Value = ((char)((vData[i] & 0xff00) / 256)).ToString() + ((char)(vData[i] & 0x00ff)).ToString(); // ASCII } }
private void gridControl_View_CellDoubleClick(object sender, DataGridViewCellEventArgs e) // 그리드뷰 더블클릭 쓰기 { int row = Grid.CurrentCell.RowIndex; int col = Grid.CurrentCell.ColumnIndex; if (state == 1) { if (e.ColumnIndex > 0) // column : 15 ~ 0 { //18~21열 if (e.ColumnIndex >= 17) // Column : HIGH ~ ASCII { string selectAddr = Grid[e.ColumnIndex, 0].Value.ToString(); string dataType = string.Empty; if (string.IsNullOrEmpty(selectAddr)) { return; } int addressNo = row; if (e.ColumnIndex == 17) { dataType = PLCSetDataType.HIGHT_BYTE; // HIGH (08 ~ 15 비트) } else if (e.ColumnIndex == 18) { dataType = PLCSetDataType.LOW_BYTE; // LOW (00 ~ 07 비트) } else if (e.ColumnIndex == 19) { dataType = PLCSetDataType.INTEGER; // ALL } else if (e.ColumnIndex == 20) { dataType = PLCSetDataType.ASCII; // ASCII } InputUI form = new InputUI(dataType, iSelectedRegister, iSelectedAddress + addressNo, this); form.ShowDialog(); } //1~16열 else { Grid[col, row].Value = 1; // 선택한 셀 데이터 값 1 int tmp = 0; try { tmp = int.Parse(Grid[e.ColumnIndex, e.RowIndex].Value.ToString()); // 문자열을 숫자로 변환 함수 } catch { return; } CDataSet ds = new CDataSet(2); byte[] tmpbyte = new byte[2]; tmpbyte = PLCManager.ReadForByte(Device_Def.SearchDeviceCode(Device_Def.Device), iSelectedAddress + (e.RowIndex), 2); // 바이트로 읽기 ds.SetSourceByteArray(0, tmpbyte); ds.SetSource(16 - e.ColumnIndex, (ds.GetSource(16 - e.ColumnIndex) == true) ? false : true); PLCManager.WriteForByte(Device_Def.SearchDeviceCode(Device_Def.Device), iSelectedAddress + (e.RowIndex), ds.GetSource()); // 바이트로 쓰기 } } RefreshDisplayPLCData(); } if (state == 2) { if (e.ColumnIndex > 0) // column : 15 ~ 0 { //18~21열 if (e.ColumnIndex >= 17) // Column : HIGH ~ ASCII { string selectAddr = Grid[e.ColumnIndex, 0].Value.ToString(); string dataType = string.Empty; if (string.IsNullOrEmpty(selectAddr)) { return; } int addressNo = row; if (e.ColumnIndex == 17) { dataType = PLCSetDataType.HIGHT_BYTE; // HIGH (08 ~ 15 비트) } else if (e.ColumnIndex == 18) { dataType = PLCSetDataType.LOW_BYTE; // LOW (00 ~ 07 비트) } else if (e.ColumnIndex == 19) { dataType = PLCSetDataType.INTEGER; // ALL } else if (e.ColumnIndex == 20) { dataType = PLCSetDataType.ASCII; // ASCII } InputUI form = new InputUI(dataType, iSelectedRegister, iSelectedAddress + addressNo, this); form.ShowDialog(); //RefreshDisplayPLCData(); } else { Grid[col, row].Value = 1; CDataSet ds = new CDataSet(2); byte[] tmpbyte = new byte[2]; tmpbyte = PLCManager.ReadForByte(Device_Def.SearchDeviceCode(Device_Def.Device), iSelectedAddress + (e.RowIndex), 2); // 바이트로 읽기 ds.SetSourceByteArray(0, tmpbyte); ds.SetSource(16 - e.ColumnIndex, (ds.GetSource(16 - e.ColumnIndex) == true) ? false : true); PLCManager.WriteForByte(Device_Def.SearchDeviceCode(Device_Def.Device), iSelectedAddress + (e.RowIndex), ds.GetSource()); wSendFrame.MakeWriteFrame(Device_Def.CMD_WORD_UNIT, Device_Def.SearchDeviceCode(Device), ds.GetSource(), iSelectedAddress + (e.RowIndex), 1); if (CL.SendMessage(wSendFrame) == false) { } } } DisplayGridData(); } }