Ejemplo n.º 1
0
        /// <summary>
        /// 获取功能码
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        private static FnCode GetFnCode(string address)
        {
            var    fcCode = address.Substring(0, 1);
            FnCode temp   = FnCode.None;

            switch (fcCode)
            {
            case "I":
                temp = FnCode.I;
                break;

            case "Q":
                temp = FnCode.Q;
                break;

            case "M":
                temp = FnCode.M;
                break;

            case "E":      //DB块
                temp = FnCode.DB;
                break;
                //            case "S":  //S代表字符串
                //                temp = DataType.String;
                //                break;
            }
            return(temp);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 获取PLC地址信息
        /// </summary>
        /// <param name="addr"></param>
        /// <returns></returns>
        public static SiemensMessage GetAddress(string addr)
        {
            SiemensMessage msg     = null;
            string         address = addr.ToUpper();

            //地址不能为空,并且字符串长度不能少于2位
            if (!string.IsNullOrEmpty(address) && address.Length > 2)
            {
                address = address.Replace("DBX", ""); // DB1.DBX0.0  =>  DB1.0.0
                address = address.Replace("DB", "E"); // DB1.DBB0 =>  E1.EB0
                address = address.Replace("DW", "L"); // MDW0  => ML0    IDW0  =>  IL0

                var arr       = address.Split('.');   //DB1.DBX0.0   M0.0   I0.0
                int arrLength = arr.Length;

                FnCode   fnCode       = GetFnCode(arr[0]); //获取功能码
                DataType dataType     = DataType.None;
                int      addressStart = 0;
                int      dbNumber     = 0;
                bool     isByte       = true;


                if (arrLength == 1)
                {  //IB0  QW0   MD0
                    dataType     = GetDataType(arr[0]);
                    addressStart = GetAddressStart(arr[0]);
                }
                else if (arrLength == 2)
                {  //I0.0  Q0.0  DB1.DBB0    DB1.DBB20
                    if (fnCode != FnCode.DB)
                    {
                        isByte       = false;
                        dataType     = DataType.Bit;
                        addressStart = GetBitStart(arr[0], arr[1]);
                    }
                    else
                    {
                        dataType     = GetDataType(arr[1]);
                        addressStart = GetAddressStart(arr[1]);
                        dbNumber     = GetDBNumber(arr[0]);
                    }
                }
                else if (arrLength == 3 && fnCode == FnCode.DB)
                {  //DB1.0.0
                    isByte       = false;
                    dbNumber     = GetDBNumber(arr[0]);
                    addressStart = GetBitStart(arr[1], arr[2]);  //有问题
                    dataType     = DataType.Bit;
                }

                if (FnCode.None != fnCode && dataType != DataType.None && addressStart >= 0 && dbNumber >= 0)
                {
                    msg = new SiemensMessage
                    {
                        FnCode      = fnCode,
                        DbBlockNo   = dbNumber,
                        DataType    = dataType,
                        DataAddress = addressStart,
                        IsByte      = isByte
                    };
                }
            }
            return(msg);
        }