Esempio n. 1
0
        //读取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));
        }
Esempio n. 2
0
        /// <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));
            }
        }