Пример #1
0
        private string WritePmcWord(ushort flib, short adr_type, ushort adr, string data)
        {
            short itemp;
            bool  ret_b = short.TryParse(data, out itemp);

            if (ret_b == false)
            {
                return("写入PMC信号失败,数据格式错误");
            }

            Focas1.IODBPMC1 buf = new Focas1.IODBPMC1();
            buf.idata    = new short[5];
            buf.idata[0] = itemp;
            buf.datano_s = (short)adr;
            buf.datano_e = (short)(adr + 1);
            buf.type_a   = adr_type;
            buf.type_d   = 1;
            var ret = Focas1.pmc_wrpmcrng(flib, 10, buf);

            if (ret != 0)
            {
                return($"写入PMC信号失败,返回:{ret}");
            }

            return(null);
        }
Пример #2
0
        private void button1_Click(object sender, EventArgs e)
        {
            //Specify the identification code corresponding to the kind of the PMC address
            //Specify the type of the PMC data.
            //Specify the start PMC address number.
            //Specify the end PMC address number.
            //Specify the data block length.
            short  a = 0, b = 0;//a=0读g地址
            ushort start = Convert.ToUInt16(textBox4.Text), end = Convert.ToUInt16(textBox3.Text);
            ushort f = 0;
            ushort N = (ushort)(end - start + 1);

            //data_type is 0(byte type) : length = 8 + N
            //data_type is 1(word type) : length = 8 + N × 2
            //data_type is 2(long type) : length = 8 + N × 4
            switch (b)
            {
            case 0:
                f = (ushort)(8 + N);
                break;

            case 1:
                f = (ushort)(8 + N * 2);
                break;

            case 2:
                f = (ushort)(8 + N * 4);
                break;
            }
            //public short   type_a ;    /* PMC address type */ /* Kind of PMC address */
            //public short   type_d ;    /* PMC data type */ /* Type of the PMC data */
            Fanuc.IODBPMC0 iodbpmc0 = new Focas1.IODBPMC0(); //byte
            Fanuc.IODBPMC1 iodbpmc1 = new Focas1.IODBPMC1(); //short
            Fanuc.IODBPMC2 iodbpmc2 = new Focas1.IODBPMC2(); //int
            int            ret      = Fanuc.pmc_rdpmcrng(Fanuc.h, a, b, start, end, f, iodbpmc0);

            //ret = Fanuc.pmc_rdpmcrng(Fanuc.h, a, b, c, d, f, iodbpmc1);
            //ret = Fanuc.pmc_rdpmcrng(Fanuc.h, a, b, c, d, f, iodbpmc2);
            if (ret == Fanuc.EW_OK)
            {
                //直接读取内部数据,结构之外的参数为输入参数
                listBox1.Items.Clear();
                listBox1.Items.Add("地址 |PMC信号状态(16进制)");
                byte[] data = iodbpmc0.cdata;
                int    j    = 0;
                for (ushort i = start; i < end; i++, j++)
                {
                    string add   = Fanuc.getpmcadd(iodbpmc0.type_a, i);
                    string value = "0X" + Convert.ToString(data[j], 16).ToString().PadLeft(2, '0').ToUpper();
                    listBox1.Items.Add(add + "|" + value);
                }
            }
            else
            {
                MessageBox.Show(ret + "");
            }
        }
Пример #3
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));
        }