Esempio n. 1
0
 public static PLCManager Get_PM()
 {
     if (PM == null)
     {
         PM = new PLCManager();
     }
     return(PM);
 }
Esempio n. 2
0
        /* 콤보박스로 디바이스 변경 필요시
         * 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();
            }
        }
Esempio n. 3
0
        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)
                {
                }
            }
        }
Esempio n. 4
0
        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
            }
        }
Esempio n. 5
0
        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();
            }
        }