Exemplo n.º 1
0
        private void Data_Proc(byte[] data)
        {
            try
            {
                Console.WriteLine("[Data수신]" + Fnc.ByteArray2HexString(data, " "));
                //헤더 체크
                if (!Fnc.bytesEqual(data, 0, _bytHeader, 0, _bytHeader.Length))
                {
                    Log_Write("헤더 불일치", enCmdType.None, true);
                    return;
                }

                string log = string.Empty;

                enCmdType cmd = enCmdType.None;

                //20~21 명령 타입
                switch (data[20])
                {
                case 0x54:           //read command
                    cmd = enCmdType.Read;
                    break;

                case 0x58:           //write command
                    cmd = enCmdType.Write;
                    break;

                case 0xBD:
                    byte[] bytData = new byte[] { 0x01, 0xff };
                    Server.Send(bytData);
                    break;

                default:
                    break;
                }

                if (cmd == enCmdType.None)
                {
                    return;
                }

                //22-23데이터타입
                enDataType dType = enDataType.Block;

                if (data[22] != 0x14)
                {
                    dType = enDataType.Unit;
                }


                //24-25 예약

                //26-27 변수 개수
                int cnt = fnc.ByteToInt(data, 26, 2);

                int     idx  = 28;
                int     ridx = 30;
                DataRow dr;
                string  add = string.Empty;
                byte[]  send;
                int     value;
                int     vLen;

                //log = string.Format("[{0}]", cmd);

                if (dType == enDataType.Block)
                {
                    vLen = fnc.ByteToInt(data, idx, 2);
                    cnt  = fnc.ByteToInt(data, idx + 2 + vLen, 2);

                    cnt = Multiple > 1 ? cnt / Multiple : cnt;
                }

                if (cmd == enCmdType.Read)
                {
                    if (dType == enDataType.Unit)
                    {
                        send = new byte[32 + cnt * 4];
                    }
                    else
                    {
                        send = new byte[32 + cnt * 2];
                    }
                }
                else
                {
                    send = new byte[30];
                }


                for (int i = 0; i < cnt; i++)
                {
                    //처음이거나 처리단위가 유닛이면
                    if (i == 0 || dType == enDataType.Unit)
                    {
                        //28-29 변수명 길이
                        vLen = fnc.ByteToInt(data, idx, 2);
                        idx += 2;

                        //30~   변수명
                        add  = fnc.BytesToAscii(data, idx, vLen);
                        add  = fnc.Address_SetAddType(add, Multiple);
                        idx += vLen;
                    }
                    else
                    {   //블록단위(연속처리)
                        add = fnc.Address_NetGet(add);
                    }

                    if (_dtAdd.Select(string.Format("Address = '{0}'", add)).Length > 0)
                    {
                        dr = _dtAdd.Select(string.Format("Address = '{0}'", add))[0];
                    }
                    else
                    {
                        dr            = _dtAdd.NewRow();
                        dr["Address"] = add;
                        dr["Value"]   = 0;
                        _dtAdd.Rows.Add(dr);
                    }


                    if (cmd == enCmdType.Read)
                    {
                        if (dType == enDataType.Unit)
                        {
                            //data size
                            fnc.ByteSetIntValue(send, ridx, 2, 2);
                            ridx += 2;
                        }

                        //datavalue
                        fnc.ByteSetIntValue(send, ridx, 2, Fnc.obj2int(dr["Value"]));
                        ridx += 2;

                        //if (i == 0 && dType == enDataType.Block & cnt > 1)
                        //    log += string.Format("[{0}", add);
                        //else if (i == 0 || dType == enDataType.Unit)
                        //    log += string.Format("[{0}] ", add);

                        log += string.Format("[{0}]{1} ", add, dr["Value"]);
                    }
                    else if (cmd == enCmdType.Write)
                    {
                        //값 길이
                        vLen = fnc.ByteToInt(data, idx, 2);
                        idx += 2;

                        //값
                        value = fnc.ByteToInt(data, idx, vLen);
                        value = Multiple > 1 ? value / Multiple : value;

                        log += string.Format("[{0}]{1}=>{2} ", add, dr["Value"], value);

                        dr["Value"] = value;
                        idx        += 2;
                    }
                }

                //if (cmd == enCmdType.Read && dType == enDataType.Block && cnt > 1)
                //{
                //    log += string.Format("~{0}] ", add);
                //}


                _bytHeader.CopyTo(send, 0);

                //plc info 10~11
                send[11] = 1;

                //cpu info [A0]XGK [A4]XGI [A8]XGR
                send[12] = data[12];

                //source of frame
                send[13] = 0x11;

                //invoke id
                send[14] = data[14];
                send[15] = data[15];

                //length
                fnc.ByteSetIntValue(send, 16, 2, send.Length);

                //response type
                if (cmd == enCmdType.Read)
                {
                    send[20] = 0x55;
                    //data type
                    send[22] = data[22];

                    //data cnt
                    fnc.ByteSetIntValue(send, 28, 2, cnt);

                    //data size
                    //fnc.ByteSetIntValue(send, 30, 2, 2);
                }
                else if (cmd == enCmdType.Write)
                {
                    send[20] = (byte)(dType == enDataType.Block ? 0x59 : 0x58);
                    send[20] = 0x59;
                    //data type
                    send[22] = data[22];

                    //data cnt
                    fnc.ByteSetIntValue(send, 28, 2, cnt);
                }



                Log_Write(log, cmd, false);

                Server.Send(send);
            }
            catch (Exception ex)
            {
                ProcException(ex, "Data_Proc");
            }
        }