//读取Focas的值 private OperateResult <string> ReadFocasData(ushort handle, string dataAddress) { string error = ""; //错误信息 string dataValue = ""; string sValueType = dataAddress.Substring(0, 1); //类型 #region 获取参数值 if ((sValueType == "R") || (sValueType == "Y") || (sValueType == "D") || (sValueType == "E") || (sValueType == "G") || (sValueType == "X")) { #region 获取PMC变量值 short valueType = ValueTypeByStr(sValueType); //内部参数类型 string sAddr = dataAddress.Substring(1); //内部地址 ushort nStarAddr = 0; //起始地址 ushort nEndAddr = 0; int iDataType = 0; //0:字节Byte(CNC中每一个都是一个Byte,如R2000的2000表示一个Byte);1:字型;2:双字型; int iGetPos = -1; //按位进行读时的位。 ushort len = 1; //长度为1 string[] addrsStrings = sAddr.Split(','); if (addrsStrings[0].Contains(".")) //字节 { iDataType = 0; double dAddr = Double.Parse(addrsStrings[0]); nStarAddr = (ushort)dAddr; iGetPos = SafeConverter.SafeToInt(addrsStrings[0].Substring(sAddr.IndexOf('.') + 1)); } else { nStarAddr = Convert.ToUInt16(addrsStrings[0]); if (addrsStrings.Count() > 1) { len = Convert.ToUInt16(addrsStrings[1]); //长度 } if (addrsStrings.Count() > 2) { iDataType = Convert.ToUInt16(addrsStrings[2]); //获取的类型 } } nEndAddr = (ushort)(nStarAddr + (len) * Math.Pow(2, iDataType) - 1); ushort cncLen = (ushort)(8 + (len) * Math.Pow(2, iDataType)); int[] values = new int[len]; short ret = 0; switch (iDataType) { case 0: //Byte Focas1.IODBPMC0 pmcdata0 = new Focas1.IODBPMC0(); // 按照Byte ret = Focas1.pmc_rdpmcrng(handle, valueType, 0, nStarAddr, nEndAddr, cncLen, pmcdata0); if (ret == Focas1.EW_OK) //成功 { for (int i = 0; i < len; i++) { values[i] = pmcdata0.cdata[i]; } } else { error = $"读取失败,错误代码[{ret}]"; } break; case 1: Focas1.IODBPMC1 pmcdata1 = new Focas1.IODBPMC1(); // 按照字型 ret = Focas1.pmc_rdpmcrng(handle, valueType, 0, nStarAddr, nEndAddr, cncLen, pmcdata1); if (ret == Focas1.EW_OK) //成功 { for (int i = 0; i < len; i++) { values[i] = pmcdata1.idata[i]; } } else { error = $"读取失败,错误代码[{ret}]"; } break; case 2: Focas1.IODBPMC2 pmcdata2 = new Focas1.IODBPMC2(); // 按照双字 ret = Focas1.pmc_rdpmcrng(handle, valueType, 0, nStarAddr, nEndAddr, cncLen, pmcdata2); if (ret == Focas1.EW_OK) //成功 { for (int i = 0; i < len; i++) { values[i] = pmcdata2.ldata[i]; } } else { error = $"读取失败,错误代码[{ret}]"; } break; default: return(new OperateResult <string>(error)); } if ((iGetPos >= 0) && (iGetPos <= 7)) //按位读取数据 { string results = Convert.ToString(values[0], 2).PadLeft(8, '0'); if (results.Length < iGetPos) { dataValue = "0"; } else { dataValue = results[7 - iGetPos].ToString(); } } else //正常读取 { dataValue = values[0].ToString(); } #endregion } else if (sValueType == "#") //读取宏变量 { string sAddr = dataAddress.Substring(1); //内部地址 short number = SafeConverter.SafeToShort(sAddr); if (number == 0) { return(new OperateResult <string>("宏变量内部地址错误,地址为:" + sAddr)); } dataValue = GetMacroData(handle, number, out error); if (error != "") { return(new OperateResult <string>($"读取宏变量[{sAddr}],错误为:" + error)); } } else if (dataAddress == "状态") //其他参数,按照参数类型进行读取 { #region 获取状态 dataValue = GetStatus(handle, out error).ToString(); #endregion } else if (dataAddress == "状态2") //其他参数,按照参数类型进行读取 { #region 获取状态 dataValue = GetStatus2(handle, out error).ToString(); #endregion } else if (dataAddress == "程序号") //读正在运行的程序信息 { #region 序号 dataValue = GetProgNum(handle, out error); #endregion } else if (dataAddress == "主程序名称") //其他参数,按照参数类型进行读取 { #region 主程序名称 dataValue = GetProgComment(handle, out error); #endregion } else if (dataAddress == "工件数") //工件数 { #region 工件数 short num = 3901; //num = 3901 工件数 3902 总工件数 dataValue = GetMacro(handle, num, out error).ToString(); #endregion } else if (dataAddress == "工件总数") //工件计数 { #region 工件计数 short num = 3902; //num = 3901 工件数 3902 总工件数 dataValue = GetMacro(handle, num, out error).ToString(); #endregion } else if (dataAddress == "进给倍率") //进给倍率 { #region 进给倍率 dataValue = GetFeedRateOverride(handle, out error).ToString(); #endregion } else if (dataAddress == "进给速度") //进给速度 { #region 进给速度 dataValue = GetFeedRateValue(handle, out error).ToString(); #endregion } else if (dataAddress == "主轴负载") //主轴负载 { #region 主轴负载 dataValue = GetSPLoad(handle, out error).ToString(); #endregion } else if (dataAddress == "主轴转速") //主轴转速 { #region 主轴转速 dataValue = GetSPSpeed(handle, out error).ToString(); #endregion } else if (dataAddress == "报警信息") //主轴转速 { #region 报警信息 dataValue = ReadAlarm(handle, out error).ToString(); #endregion } #endregion if (string.IsNullOrEmpty(error)) { return(OperateResult.CreateSuccessResult <string>(dataValue)); } return(new OperateResult <string>(error)); }
/// <summary> /// 同步写数据,支持按照位写 /// </summary> /// <param name="dataAddress">地址位;R2000</param> /// <param name="dataValues"></param> /// <returns></returns> public OperateResult SyncWriteData(string dataAddress, string dataValues) { if (string.IsNullOrEmpty(dataAddress) || string.IsNullOrEmpty(dataValues)) { return(new OperateResult("传入的参数都不能为空")); } if (dataAddress.Length <= 1) { return(new OperateResult("Tag地址长度不正确")); } string dataValue = dataValues.Split('|')[0]; #region 特殊地址解析 string[] addresses = dataAddress.Split('|'); if ((addresses.Length > 1) && (!string.IsNullOrEmpty(addresses[1]))) { dataValue = string.Format(addresses[1].Replace("#13", "\n"), dataValues.Split('|')); dataAddress = addresses[0]; } #endregion string sInfo = $"写入 Fanuc CNC 设备IP({ServerIP}) 地址({dataAddress}) 值({dataValue}) "; try { string sValueType = dataAddress.Substring(0, 1); //类型 short valueType = 0; //参数类型 string sAddr = dataAddress.Substring(1); //内部地址 string startAddr = sAddr; int iGetPos = -1; //按位进行读时的位。 if (sAddr.Contains('.')) //按位写 { startAddr = sAddr.Substring(0, sAddr.IndexOf('.')); iGetPos = SafeConverter.SafeToInt(sAddr.Substring(sAddr.IndexOf('.') + 1)); } #region 获取类型 valueType = ValueTypeByStr(sValueType); if ((valueType == 0) && (dataAddress != "写入刀补")) //不支持的类型 { string errorType = $"Fanuc CNC 设备 IP({ServerIP}) 地址({dataAddress}) 值({dataValue}),写入失败,不支持的类型."; Console.WriteLine(errorType); return(new OperateResult(errorType)); } #endregion #region Focas 写值 Console.WriteLine($"---Fanuc CNC 设备 IP({ServerIP}) 地址({dataAddress}) 值({dataValue})"); string error = ""; ushort handel = GetFocasHandle(out error); //获取 连接Focas的Handel short ret; if (!string.IsNullOrEmpty(error)) { Console.WriteLine(sInfo + $"失败,连接错误代码({error})"); return(new OperateResult(handel, sInfo + "失败,连接错误代码(" + error + ")")); } ushort nAddr = SafeConverter.SafeToUshort(startAddr); //地址 short nRValue = SafeConverter.SafeToShort(dataValue); //写入值 if (dataAddress == "写入刀补") { #region 写入刀补 ret = DownToolOffset(handel, dataValue, out error); if (ret != Focas1.EW_OK) //失败,两次写入 { FreeFocasHandle(out error); //释放 handel = GetFocasHandle(out error); //重新连接Focas的Handel if (!string.IsNullOrEmpty(error)) { Console.WriteLine(sInfo + $"失败,连接错误代码({error})"); return(new OperateResult(ret, sInfo + "失败,连接错误代码(" + error + ")")); } ret = DownToolOffset(handel, dataValue, out error); } #endregion } else if (sValueType == "#") //写宏变量 { #region 写宏变量 ret = SetMacroData(handel, SafeConverter.SafeToShort(nAddr), SafeConverter.SafeToDouble(dataValue), out error); if (ret != Focas1.EW_OK) //失败,两次写入 { FreeFocasHandle(out error); //释放 handel = GetFocasHandle(out error); //重新连接Focas的Handel if (!string.IsNullOrEmpty(error)) { Console.WriteLine(sInfo + $"失败,连接错误代码({error})"); return(new OperateResult(ret, sInfo + "失败,连接错误代码(" + error + ")")); } ret = SetMacroData(handel, SafeConverter.SafeToShort(nAddr), SafeConverter.SafeToDouble(dataValue), out error); } #endregion } else if (valueType < 100) { #region 写PMC,先读后写 Focas1.IODBPMC0 pmcdata1 = new Focas1.IODBPMC0(); // for 1 Byte ret = Focas1.pmc_rdpmcrng(handel, valueType, 0, nAddr, nAddr, 9, pmcdata1); // D data of 1 Byte if (ret != Focas1.EW_OK) //失败,两次写入 { FreeFocasHandle(out error); //释放 handel = GetFocasHandle(out error); //重新连接Focas的Handel if (!string.IsNullOrEmpty(error)) { Console.WriteLine(sInfo + $"失败,连接错误代码({error})"); return(new OperateResult(ret, sInfo + "失败,连接错误代码(" + error + ")")); } ret = Focas1.pmc_rdpmcrng(handel, valueType, 0, nAddr, nAddr, 9, pmcdata1); // D data of 1 Byte if (ret != Focas1.EW_OK) { Console.WriteLine(sInfo + "失败(读取时),错误代码(" + ret + ")"); return(new OperateResult(ret, sInfo + "失败(读取时),错误代码(" + ret + ")")); } } if ((iGetPos >= 0) && (iGetPos <= 7)) //按位读取数据 { int oldValue = pmcdata1.cdata[0]; byte newValue = (byte)(1 << iGetPos); if (nRValue > 0) //置位 { pmcdata1.cdata[0] = (byte)(oldValue | newValue); //按位或 } else //复位 { pmcdata1.cdata[0] = (byte)(oldValue & (newValue ^ 255)); //按位与 } } else //正常读写 { pmcdata1.cdata[0] = Convert.ToByte(nRValue); } ret = Focas1.pmc_wrpmcrng(handel, nAddr, pmcdata1); #endregion } else { return(new OperateResult(handel, "写Fanuc CNC 数据失败!错误的类型!")); } if (ret != Focas1.EW_OK) { Console.WriteLine(sInfo + "失败(写入时),错误代码(" + ret + ")"); return(new OperateResult(ret, sInfo + "失败(写入时),错误代码(" + ret + ")")); } Console.WriteLine("-----" + sInfo + "成功---"); #endregion return(OperateResult.CreateSuccessResult()); //返回成功 } catch (Exception ex) { string error = sInfo + $"失败,错误为({ex.Message})"; Console.WriteLine(error); return(new OperateResult(error)); } }