/// <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); }
/// <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); }