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

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

            Focas1.IODBPMC0 buf = new Focas1.IODBPMC0();
            buf.cdata    = new byte[12];
            buf.cdata[0] = btemp;
            buf.datano_s = (short)adr;
            buf.datano_e = (short)adr;
            buf.type_a   = adr_type;
            buf.type_d   = 0;
            var ret = Focas1.pmc_wrpmcrng(flib, 9, buf);

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

            return(null);
        }
Пример #2
0
        //进给倍率
        private static int GetFeedRateOverride(string deviceAddress, out string error)
        {
            error = "";
            //进给倍率,攻进倍率:0-200% 10%为1档   进给G01 取地址G12
            ushort m_handle;

            Focas1.IODBPMC0 info = new Focas1.IODBPMC0();
            short           nRet = Focas1.cnc_allclibhndl3(deviceAddress, 8193, 2, out m_handle);

            if (nRet == Focas1.EW_OK)
            {
                //  Focas1.pmc_rdpmcrng(Handle, 0, 1, 12, 12, 10, info);
                nRet = Focas1.pmc_rdpmcrng(m_handle, 0, 0, 12, 12, 9, info);
            }

            if (nRet == Focas1.EW_OK)
            {
                int nFeedRate = 255 - info.cdata[0];

                Focas1.cnc_freelibhndl(m_handle); //释放连接
                return(nFeedRate);
            }

            error = "连接失败";
            return(0);
        }
Пример #3
0
        private void button2_Click(object sender, EventArgs e)
        {
            //提示数据长度错误,但是对象中没有相应的属性可以设置
            //Specify the type of the PMC data.
            ushort a = 8 + 5 * 2;//写入数据长度

            Fanuc.IODBPMC0 iodbpmc0 = new Focas1.IODBPMC0();
            iodbpmc0.datano_s = Convert.ToInt16(textBox4.Text); //开始位置
            iodbpmc0.datano_e = Convert.ToInt16(textBox3.Text); //结束位置
            iodbpmc0.type_a   = 0;                              //pmc地址类型  g 0
            iodbpmc0.type_d   = 0;                              //pmc数据类型  byte 0
            string[] data = textBox2.Text.Split(' ');
            byte[]   buf  = new byte[5];
            for (int i = 0; i < 5; i++)
            {
                buf[i] = Convert.ToByte(data[i], 16);
            }
            iodbpmc0.cdata = buf;
            int ret = Fanuc.pmc_wrpmcrng(Fanuc.h, a, iodbpmc0);

            if (ret == Fanuc.EW_OK)
            {
                MessageBox.Show("写入成功!");
            }
            else
            {
                MessageBox.Show(ret + "");
            }
        }
Пример #4
0
        //写K地址
        private short WritePmcKAddr(ushort nAddr, short nRValue)
        {
            ushort _Flibhndl = 0;
            //建立连接
            short ret = Focas1.cnc_allclibhndl3(IP, 8193, 3, out _Flibhndl);

            if (ret == Focas1.EW_OK)                                                   //连接成功
            {
                Focas1.IODBPMC0 pmcdata1 = new Focas1.IODBPMC0();                      // for 1 Byte

                ret = Focas1.pmc_rdpmcrng(_Flibhndl, 7, 0, nAddr, nAddr, 9, pmcdata1); // D data of 1 Byte

                short value = pmcdata1.cdata[0];
                pmcdata1.cdata[0] = Convert.ToByte(nRValue);
                ret = Focas1.pmc_wrpmcrng(_Flibhndl, 9, pmcdata1);
                if (ret == 0)
                {
                    Focas1.cnc_freelibhndl(_Flibhndl);
                    return(ret);
                }
                else
                {
                    Focas1.cnc_freelibhndl(_Flibhndl);
                    throw new Exception("CNC写K地址写入出错" + ret);
                }
            }
            else
            {
                throw new Exception("CNC写K地址出错连接失败" + ret);
            }
        }
Пример #5
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 + "");
            }
        }
Пример #6
0
        public AxisOverride GetAxisOverride()
        {
            Focas1.IODBPMC0 iodbpmc0     = new Focas1.IODBPMC0();
            AxisOverride    axisOverride = new AxisOverride();

            var axisOverrideReturnCode = (ReturnCodes.Code)Focas1.pmc_rdpmcrng(focasHandle, (short)0, (short)0, (ushort)10, (ushort)12, (ushort)24, iodbpmc0);

            axisOverride.returnCode = axisOverrideReturnCode;
            axisOverride.Override   = ((int)byte.MaxValue - (int)iodbpmc0.cdata[2]);

            return(axisOverride);
        }
Пример #7
0
        public Spindle GetSpindleOverride()
        {
            Focas1.IODBPMC0 iodbpmc0 = new Focas1.IODBPMC0();
            Spindle         spindle  = new Spindle();

            var spindleReturnCode = (ReturnCodes.Code)Focas1.pmc_rdpmcrng(focasHandle, (short)0, (short)0, (ushort)30, (ushort)30, (ushort)16, iodbpmc0);

            spindle.returnCode = spindleReturnCode;
            spindle.Override   = (int)iodbpmc0.cdata[0];

            return(spindle);
        }
Пример #8
0
        //写Y地址
        private short WritePmcYAddrBool(ushort nAddr, byte BitOffset, bool nRValue)
        {
            ushort _Flibhndl = 0;
            //建立连接
            short ret = Focas1.cnc_allclibhndl3(IP, 8193, 3, out _Flibhndl);

            if (ret == Focas1.EW_OK)//连接成功
            {
                Focas1.IODBPMC0 info = new Focas1.IODBPMC0();
                //ret = Focas1.pmc_rdpmcrng(_Flibhndl, 9, 0, 6000, 6000, 9, info); //
                //int flag = (info.cdata[0] & 2) == 2 ? 1 : 0; //d6000.1      .0是1/.1是2/.2是4/6/8
                //if (flag == 0)
                //{
                //    info.cdata[0] += 2;  //这是写1的情况,写0的话就是反逻辑
                //}

                byte BitOffset2 = Convert.ToByte(Math.Pow(2, BitOffset));
                ret = Focas1.pmc_rdpmcrng(_Flibhndl, 2, 0, nAddr, nAddr, 9, info); //Y地址是2
                bool flag = (info.cdata[0] & BitOffset2) == BitOffset2 ? true : false;

                if (nRValue)   //要写入的是true
                {
                    if (!flag) //当前值是false
                    {
                        info.cdata[0] += BitOffset2;
                    }
                }
                else          //要写入的值是false
                {
                    if (flag) //当前值是true
                    {
                        info.cdata[0] -= BitOffset2;
                    }
                }

                ret = Focas1.pmc_wrpmcrng(_Flibhndl, 9, info);
                if (ret == 0)
                {
                    Focas1.cnc_freelibhndl(_Flibhndl);
                    return(ret);
                }
                else
                {
                    Focas1.cnc_freelibhndl(_Flibhndl);
                    throw new Exception("CNC写Y地址写入出错" + ret);
                }
            }
            else
            {
                throw new Exception("CNC写Y地址出错连接失败" + ret);
            }
        }
Пример #9
0
        //写R地址
        private void WritePmcRAddr(ushort nAddr, short nRValue)
        {
            //建立连接
            var ret = Focas1.cnc_allclibhndl3(IP, 8193, 3, out var flibhndl);

            if (ret == Focas1.EW_OK)                                                  //连接成功
            {
                Focas1.IODBPMC0 pmcdata1 = new Focas1.IODBPMC0();                     // for 1 Byte

                ret = Focas1.pmc_rdpmcrng(flibhndl, 5, 0, nAddr, nAddr, 9, pmcdata1); // D data of 1 Byte

                short value = pmcdata1.cdata[0];
                pmcdata1.cdata[0] = Convert.ToByte(nRValue);
                ret = Focas1.pmc_wrpmcrng(flibhndl, 9, pmcdata1);
                if (ret == 0)
                {
                    Focas1.cnc_freelibhndl(flibhndl);
                    return;
                }
                else
                {
                    Focas1.cnc_freelibhndl(flibhndl);
                    throw new Exception("CNC写R地址写入出错" + ret);
                }
            }
            else
            {
                throw new Exception("CNC写R地址出错连接失败" + ret);
            }
            //Focas1.IODBPMC0 pmcdata1 = new Focas1.IODBPMC0(); // for 1 Byte

            //short ret = Focas1.pmc_rdpmcrng(Flibhndl, 5, 0, nAddr, nAddr, 9, pmcdata1); // D data of 1 Byte
            //if (ret == 0)
            //{
            //    short value = pmcdata1.cdata[0];
            //    pmcdata1.cdata[0] = Convert.ToByte(nRValue);
            //    ret = Focas1.pmc_wrpmcrng(Flibhndl, nAddr, pmcdata1);
            //    if (ret == 0)
            //    {
            //        return ret;
            //    }
            //    else
            //    {
            //        throw new Message("CNC写地址出错" + ret);
            //    }
            //}
            //else
            //{
            //    throw new Message("CNC写地址出错" + ret);
            //}
        }
        internal void SetMachineUnlock(ushort UnLockDBit, ushort LockDBit)
        {
            Focas1.focas_ret retallclibhndl3 = (Focas1.focas_ret)Focas1.cnc_allclibhndl3(ip, port, timeout, out h);
            //Locking D Bit Parameters
            var    rdpmcdataLockBit = new Focas1.IODBPMC0();
            short  adr_type         = 9;
            short  data_type        = 0;
            ushort s_number         = LockDBit;
            ushort e_number         = LockDBit;
            ushort length           = 9;

            short rdretLock = Focas1.pmc_rdpmcrng(h, adr_type, data_type, s_number, e_number, length, rdpmcdataLockBit);

            var wrpmcdataLock = rdpmcdataLockBit;

            wrpmcdataLock.cdata[0] = 0;
            for (int i = 0; i < 10; i++)
            {
                short wrret = Focas1.pmc_wrpmcrng(h, length, wrpmcdataLock);
            }

            //UnLocking D Bit Parameters
            var    rdpmcdataUnLockBit = new Focas1.IODBPMC0();
            short  adr_typeUn         = 9;
            short  data_typeUn        = 0;
            ushort s_numberUn         = UnLockDBit;
            ushort e_numberUn         = UnLockDBit;
            ushort lengthUn           = 9;

            short rdretUnLock = Focas1.pmc_rdpmcrng(h, adr_typeUn, data_typeUn, s_numberUn, e_numberUn, lengthUn, rdpmcdataUnLockBit);

            var wrpmcdataUn = rdpmcdataUnLockBit;

            wrpmcdataUn.cdata[0] = 1;
            for (int i = 0; i < 10; i++)
            {
                short wrret = Focas1.pmc_wrpmcrng(h, lengthUn, wrpmcdataUn);
            }

            Thread.Sleep(2000);
            //Lock D Bit reverted back to OFF State
            rdretUnLock = Focas1.pmc_rdpmcrng(h, adr_typeUn, data_typeUn, s_numberUn, e_numberUn, lengthUn, rdpmcdataUnLockBit);
            var wrpmcdata1 = rdpmcdataUnLockBit;

            wrpmcdata1.cdata[0] = 0;
            for (int i = 0; i < 10; i++)
            {
                short wrret = Focas1.pmc_wrpmcrng(h, lengthUn, wrpmcdata1);
            }
        }
Пример #11
0
        //返回-16代表未获取成功
        //读Y地址
        private short GetYValue(ushort YAddr)
        {
            Focas1.IODBPMC0 pmcdata1 = new Focas1.IODBPMC0();                           // for 1 Byte

            short ret = Focas1.pmc_rdpmcrng(Flibhndl, 2, 0, YAddr, YAddr, 9, pmcdata1); // D data of 1 Byte

            if (ret == 0)
            {
                short value = pmcdata1.cdata[0];
                return(value);
            }
            else
            {
                throw new Exception("CNC读取Y地址出错" + ret);
            }
        }
Пример #12
0
        //进给倍率
        private int GetFeedRateOverride(ushort handle, out string error)
        {
            error = "";
            //进给倍率,攻进倍率:0-200% 10%为1档   进给G01 取地址G12
            Focas1.IODBPMC0 info = new Focas1.IODBPMC0();
            short           nRet = Focas1.pmc_rdpmcrng(handle, 0, 0, 12, 12, 9, info);

            if (nRet == Focas1.EW_OK)
            {
                int nFeedRate = 255 - info.cdata[0];
                return(nFeedRate);
            }

            error = $"读取错误!错误代号[{nRet}]";
            return(0);
        }
Пример #13
0
        private string ReadPmcBit(ushort flib, short adr_type, ushort adr, ushort bit, ref bool data)
        {
            Focas1.IODBPMC0 buf = new Focas1.IODBPMC0();
            buf.cdata = new byte[1];
            short ret = Focas1.pmc_rdpmcrng(flib, adr_type, 0, adr, adr, 9, buf);

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

            byte bd = (byte)(0x01 << bit);

            data = (buf.cdata[0] & bd) > 0;

            return(null);
        }
Пример #14
0
        //读A地址
        private short ReadPmcAAddr(ushort nAddr, out short nRValue)
        {
            Focas1.IODBPMC0 pmcdata1 = new Focas1.IODBPMC0();                           // for 1 Byte

            short ret = Focas1.pmc_rdpmcrng(Flibhndl, 4, 0, nAddr, nAddr, 9, pmcdata1); // D data of 1 Byte

            if (ret == 0)
            {
                short value = pmcdata1.cdata[0];
                nRValue = Convert.ToInt16(pmcdata1.cdata[0]);
                return(ret);
            }
            else
            {
                throw new Exception("CNC读取A地址出错" + ret);
            }
        }
Пример #15
0
 /// <summary>
 /// 以10进制的形式向指定pmc中写值
 /// </summary>
 /// <param name="address"></param>
 /// <param name="oneData"></param>
 public void WriterPmc(string address, string oneData)
 {
     try
     {
         //提示数据长度错误,但是对象中没有相应的属性可以设置
         //Specify the type of the PMC data.
         string addressKindStr = address.Substring(0, 1);
         int    addressKindInt = 0;
         int    addressNo      = int.Parse(address.Substring(1, 4).TrimStart('0') == "" ? "0" : address.Substring(1, 4).TrimStart('0'));
         for (int i = 0; i < pmcAddress.Keys.Count; i++)
         {
             if (pmcAddress[i].ToString() == addressKindStr)
             {
                 addressKindInt = i;
                 break;
             }
         }
         ushort         a        = 8 + 2 * 1;
         Fanuc.IODBPMC0 iodbpmc0 = new Focas1.IODBPMC0();
         iodbpmc0.datano_s = Convert.ToInt16(addressNo);
         iodbpmc0.datano_e = Convert.ToInt16(addressNo + 1);
         iodbpmc0.type_a   = Convert.ToInt16(addressKindInt);
         iodbpmc0.type_d   = 0;
         string[] data = { oneData };
         byte[]   buf  = new byte[5];
         for (int i = 0; i < 1; i++)
         {
             buf[i] = Convert.ToByte(data[i], 16);
         }
         iodbpmc0.cdata = buf;
         int ret = Fanuc.pmc_wrpmcrng(Fanuc.h, a, iodbpmc0);
         if (ret == Fanuc.EW_OK)
         {
             MessageBox.Show("写入成功!");
         }
         else
         {
             MessageBox.Show(ret + "");
         }
     }
     catch (Exception e)
     {
         MessageBox.Show("输入的内容错误,详细:" + e.ToString());
     }
 }
Пример #16
0
        private string WritePmcBit(ushort flib, short adr_type, ushort adr, ushort bit, string data)
        {
            bool btemp;
            bool ret_b = bool.TryParse(data, out btemp);

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

            Focas1.IODBPMC0 buf = new Focas1.IODBPMC0();
            buf.cdata = new byte[1];
            var ret = Focas1.pmc_rdpmcrng(flib, adr_type, 0, adr, adr, 9, buf);

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

            byte bd = (byte)(0x01 << bit);

            if (btemp == true)
            {
                buf.cdata[0] = (byte)(buf.cdata[0] | bd);
            }
            else
            {
                buf.cdata[0] = (byte)(buf.cdata[0] & (~bd));
            }

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

            return(null);
        }
Пример #17
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));
            }
        }
Пример #18
0
        //------------------------------------------------------------------------------------------------------------------//
        //---------------------------------- Get  Changed Values -----------------------------------------------------------//
        //------------------------------------------------------------------------------------------------------------------//

        public void getChangedValues(MachineTool machineTool)
        {
            mAdapter.Begin();

            // Display if machine is available
            if (machineTool.connected)
            {
                mAvail.Value = "AVAILABLE";

                // Display Active Process
                Focas1.cnc_getpath(machineTool.hFanucMonitor, out path, out maxPath);
                if (path == 1)
                {
                    mSelProc.Value = "1";
                }
                else if (path == 2)
                {
                    mSelProc.Value = "2";
                }

//--------------------------------------------------------------------------------------------------------------
                // Display Active Part Program & Sub-Program
                short ret2 = Focas1.cnc_rdexecprog(machineTool.hFanucMonitor, ref length, out blkNum, lineData);
                mBlkNum.Value = blkNum.ToString();
                mActiveLine.Value = GetProgramName(lineData, "\n");

//--------------------------------------------------------------------------------------------------------------
                Focas1.cnc_rdprgnum(machineTool.hFanucMonitor, subProgram);
                mSubProgram.Value = subProgram.data.ToString();

//--------------------------------------------------------------------------------------------------------------
                int ret = Focas1.cnc_exeprgname(machineTool.hFanucMonitor, mainProgram);
                //string progName = mainProgram.name.ToString();
                mProgram.Value = GetProgramName(mainProgram.name, "\0");

//--------------------------------------------------------------------------------------------------------------
                /*uint lineToReadFrom = 1;
                string progData = string.Empty;
                uint linesToRead = 5;
                uint charToRead = 100;

                Focas1.cnc_rdprogline2(machineTool.hFanucMonitor, mainProgram.o_num, lineToReadFrom, progData, ref linesToRead, ref charToRead);*/

//--------------------------------------------------------------------------------------------------------------
                // Display the current selected mode
                switch (machineTool.fanucStatus.aut)
                {
                    case 0:
                        {
                            mMode.Value = "MDI";
                            break;
                        }
                    case 1:
                        {
                            mMode.Value = "AUTO";
                            break;
                        }
                    case 3:
                        {
                            mMode.Value = "EDIT";
                            break;
                        }
                    case 4:
                        {
                            mMode.Value = "HAND WHEEL";
                            break;
                        }
                    case 5:
                        {
                            mMode.Value = "JOG";
                            break;
                        }
                    case 6:
                        {
                            mMode.Value = "TEACH JOG";
                            break;
                        }
                    case 7:
                        {
                            mMode.Value = "TEACH HANDLE";
                            break;
                        }
                    case 8:
                        {
                            mMode.Value = "INC FEED";
                            break;
                        }
                    case 9:
                        {
                            mMode.Value = "REFERENCE";
                            break;
                        }
                    case 10:
                        {
                            mMode.Value = "REMOTE";
                            break;
                        }
                }

//--------------------------------------------------------------------------------------------------------------
                // Currently Selected Table
                mSelTable.Value = 0;

//--------------------------------------------------------------------------------------------------------------
                // Current Active Tool
                if (machineTool.gifuChanger == false)
                {
                    Focas1.pmc_rdpmcrng(machineTool.hFanucMonitor, addrType, dataType, toolData, toolData, dataLength,
                        pmcData);
                    mActiveTool.Value = pmcData.cdata[0].ToString();
                }
                else
                {
                    Focas1.ODBM macroInfo = new Focas1.ODBM();
                    Focas1.cnc_rdmacro(machineTool.hFanucMonitor, 276, 10, macroInfo);
                    float toolNum = macroInfo.mcr_val / (10 ^ macroInfo.dec_val);
                    mActiveTool.Value = toolNum.ToString();
                }


//--------------------------------------------------------------------------------------------------------------
                // Display Alarms
                alarmNum = 10;
                ret = Focas1.cnc_rdalmmsg2(machineTool.hFanucMonitor, -1, ref alarmNum, alarmMsg);
                alarm[0] = alarmMsg.msg1.alm_msg;
                alarm[1] = alarmMsg.msg2.alm_msg;
                alarm[2] = alarmMsg.msg3.alm_msg;
                alarm[3] = alarmMsg.msg4.alm_msg;
                alarm[4] = alarmMsg.msg5.alm_msg;
                alarm[5] = alarmMsg.msg6.alm_msg;
                alarm[6] = alarmMsg.msg7.alm_msg;
                alarm[7] = alarmMsg.msg8.alm_msg;
                alarm[8] = alarmMsg.msg9.alm_msg;
                alarm[9] = alarmMsg.msg10.alm_msg;

                alarm[0] = alarm[0].Substring(0, alarmMsg.msg1.msg_len);
                alarm[1] = alarm[1].Substring(0, alarmMsg.msg2.msg_len);
                alarm[2] = alarm[2].Substring(0, alarmMsg.msg3.msg_len);
                alarm[3] = alarm[3].Substring(0, alarmMsg.msg4.msg_len);
                alarm[4] = alarm[4].Substring(0, alarmMsg.msg5.msg_len);
                alarm[5] = alarm[5].Substring(0, alarmMsg.msg6.msg_len);
                alarm[6] = alarm[6].Substring(0, alarmMsg.msg7.msg_len);
                alarm[7] = alarm[7].Substring(0, alarmMsg.msg8.msg_len);
                alarm[8] = alarm[8].Substring(0, alarmMsg.msg9.msg_len);
                alarm[9] = alarm[9].Substring(0, alarmMsg.msg10.msg_len);

                alarmType[0] = almType(alarmMsg.msg1.type);
                alarmType[1] = almType(alarmMsg.msg2.type);
                alarmType[2] = almType(alarmMsg.msg3.type);
                alarmType[3] = almType(alarmMsg.msg4.type);
                alarmType[4] = almType(alarmMsg.msg5.type);
                alarmType[5] = almType(alarmMsg.msg6.type);
                alarmType[6] = almType(alarmMsg.msg7.type);
                alarmType[7] = almType(alarmMsg.msg8.type);
                alarmType[8] = almType(alarmMsg.msg9.type);
                alarmType[9] = almType(alarmMsg.msg10.type);

                alarmNumber[0] = alarmMsg.msg1.alm_no.ToString() + ": ";
                alarmNumber[1] = alarmMsg.msg2.alm_no.ToString() + ": ";
                alarmNumber[2] = alarmMsg.msg3.alm_no.ToString() + ": ";
                alarmNumber[3] = alarmMsg.msg4.alm_no.ToString() + ": ";
                alarmNumber[4] = alarmMsg.msg5.alm_no.ToString() + ": ";
                alarmNumber[5] = alarmMsg.msg6.alm_no.ToString() + ": ";
                alarmNumber[6] = alarmMsg.msg7.alm_no.ToString() + ": ";
                alarmNumber[7] = alarmMsg.msg8.alm_no.ToString() + ": ";
                alarmNumber[8] = alarmMsg.msg9.alm_no.ToString() + ": ";
                alarmNumber[9] = alarmMsg.msg10.alm_no.ToString() + ": ";

                for (short i = 0; i < alarmType.Length; i++)
                {
                    if (alarmType[i] == "SW" && alarm[i].ToString() == string.Empty)
                    {
                        alarmType[i] = string.Empty;
                        alarm[i] = string.Empty;
                        alarmNumber[i] = string.Empty;
                    }
                }
                mAlarm1.Value = alarmType[0].ToString() + alarmNumber[0] + alarm[0].ToString();
                mAlarm2.Value = alarmType[1].ToString() + alarmNumber[1] + alarm[1].ToString();
                mAlarm3.Value = alarmType[2].ToString() + alarmNumber[2] + alarm[2].ToString();
                mAlarm4.Value = alarmType[3].ToString() + alarmNumber[3] + alarm[3].ToString();
                mAlarm5.Value = alarmType[4].ToString() + alarmNumber[4] + alarm[4].ToString();
                mAlarm6.Value = alarmType[5].ToString() + alarmNumber[5] + alarm[5].ToString();
                mAlarm7.Value = alarmType[6].ToString() + alarmNumber[6] + alarm[6].ToString();
                mAlarm8.Value = alarmType[7].ToString() + alarmNumber[7] + alarm[7].ToString();
                mAlarm9.Value = alarmType[8].ToString() + alarmNumber[8] + alarm[8].ToString();
                mAlarm10.Value = alarmType[9].ToString() + alarmNumber[9] + alarm[9].ToString();

//--------------------------------------------------------------------------------------------------------------
                // Clocks
                Focas1.cnc_rdparam(machineTool.hFanucMonitor, 6758, 0, 8, cycTimeMin);
                Focas1.cnc_rdparam(machineTool.hFanucMonitor, 6757, 0, 8, cycTimeSec);
                mCycleTime.Value = cycTimeMin.cdata.ToString() + "." + (cycTimeSec.ldata / 1000).ToString();

                //Focas1.cnc_rdtimer(machineTool.hFanucLib, 1, cycleTime);
                // mOpTime.Value = cycleTime.minute.ToString() + "." + cycleTime.msec.ToString();

//--------------------------------------------------------------------------------------------------------------
                // Display Feed, Speed overrides
                ret = Focas1.pmc_rdpmcrng(machineTool.hFanucMonitor, 0, 0, 96, 96, 16, pmcOverrides);
                mFeedOv.Value = (255-pmcOverrides.cdata[0]).ToString();
                ret = Focas1.pmc_rdpmcrng(machineTool.hFanucMonitor, 0, 0, 30, 30, 16, pmcOverrides);
                mSpeedOv.Value = pmcOverrides.cdata[0].ToString();

//--------------------------------------------------------------------------------------------------------------
                // Display Programmed Feed & Speed
                mPrgFeed.Value = "0";
                mPrgSpeed.Value = "0";

//--------------------------------------------------------------------------------------------------------------
                // Check the current feed rates
                Focas1.ODBACT feedRate = new Focas1.ODBACT();
                Focas1.cnc_actf(machineTool.hFanucMonitor, feedRate);
                mRealFeed.Value = (feedRate.data / 10000).ToString();

//--------------------------------------------------------------------------------------------------------------
                // Check Spindle Speed
                Focas1.ODBACT2 spindleSpeed = new Focas1.ODBACT2();
                Focas1.cnc_acts2(machineTool.hFanucMonitor, 1, spindleSpeed);
                mRealSpeed.Value = (spindleSpeed.data[0] / 10000).ToString();

//--------------------------------------------------------------------------------------------------------------
                // Get Drives Ready
                int ret3 = Focas1.pmc_rdpmcrng(machineTool.hFanucMonitor, 1, 0, 1, 1, 16, pmcDrivesOn);
                driveReady = GetBit(pmcDrivesOn.cdata[0], 7, true);
                mDrivesReady.Value = driveReady ? "Ready" : "Not Ready";

//--------------------------------------------------------------------------------------------------------------
                // Get Messages
                Focas1.OPMSG3 opmsg = new Focas1.OPMSG3();
                short msgSize = 5;
                Focas1.cnc_rdopmsg3(machineTool.hFanucMonitor, -1, ref msgSize, opmsg);

                // Op Message 1
                if (opmsg.msg1.datano != 0 && opmsg.msg1.datano != -1)
                {
                    mOpMsg1.Value = opmsg.msg1.data.ToString();
                }
                else
                {
                    mOpMsg1.Value = string.Empty;
                }

                // Op Message 2
                if (opmsg.msg2.datano != 0 && opmsg.msg2.datano != -1)
                {
                    mOpMsg2.Value = opmsg.msg2.data.ToString();
                }
                else
                {
                    mOpMsg2.Value = string.Empty;
                }

                // Op Message 3
                if (opmsg.msg3.datano != 0 && opmsg.msg3.datano != -1)
                {
                    mOpMsg3.Value = opmsg.msg3.data.ToString();
                }
                else
                {
                    mOpMsg3.Value = string.Empty;
                }

                // Op Message 4
                if (opmsg.msg4.datano != 0 && opmsg.msg4.datano != -1)
                {
                    mOpMsg4.Value = opmsg.msg4.data.ToString();
                }
                else
                {
                    mOpMsg4.Value = string.Empty;
                }

//--------------------------------------------------------------------------------------------------------------
                // Get Drives On
                ret3 = Focas1.pmc_rdpmcrng(machineTool.hFanucMonitor, 1, 0, 0, 0, 16, pmcDrivesOn);
                drivesOn = GetBit(pmcDrivesOn.cdata[0], 2);
                mDrivesOn.Value = drivesOn ? "Drives On" : "Drives Off";

//--------------------------------------------------------------------------------------------------------------
                // If Drives are not on and we have a reason set already, figure out how long we have been in estop
                if (!drivesOn && reasonSet)
                {
                    mDownTimeDuration.Value = dt.GetElapsedDownTime(ref totalElapsedDT);
                }

                // If the drives are not on and we do not have a reason set, show the reason popup box
                // And start our downtime counter. Also set reason to true. 
                if (!drivesOn && !reasonSet)
                {
                    machineTool.Invoke((MethodInvoker)delegate() { dt.Show(); });
                    startTime = dt.startDownTimeCounter();
                    reasonSet = true;
                }

                // If the drives are on (We have cleared all the errors), and we have a reason set (We just came out of estop)
                // So we will get the duration of the downtime, the reason for the downtime and record it.
                if (drivesOn && reasonSet)
                {
                    duration = dt.GetElapsedDownTime(ref totalElapsedDT);
                    endTime = dt.stopDownTimeCounter();
                    mDTReason.Value = dt.reason;

                    // Log the Downtime here
                    dtBuffer = true;
                    BufferDataItems();
                    dtBuffer = false;

                    reasonSet = false;
                }

                if (mDTReason.Value != string.Empty)
                {
                    // Now that we are back in our normal loop, the reason is no longer needed
                    // So now we set it to an empty string and set it to the reason for the last
                    // Downtime period that we had.
                    mDTLastReason.Value = dt.reason;
                    mDTReason.Value = string.Empty;
                    mDownTimeDuration.Value = string.Empty;
                    mLastDownTimeDuration.Value = duration;
                }

//---------------------------------------------------------------------------------------------------------------



                

                // Get Feed Hold


                // Vac On / Off
                Focas1.IODBPMC0 vacSensors = new Focas1.IODBPMC0();
                ret3 = Focas1.pmc_rdpmcrng(machineTool.hFanucMonitor, 5, 0, 46,46, 16, vacSensors);
                bool vac1 = GetBit(vacSensors.cdata[0], 1, false);
                bool vac2 = GetBit(vacSensors.cdata[0], 2, false);
                bool vac3 = GetBit(vacSensors.cdata[0], 3, false);
                bool vac4 = GetBit(vacSensors.cdata[0], 4, false);
                bool vac5 = GetBit(vacSensors.cdata[0], 5, false);
                bool vac6 = GetBit(vacSensors.cdata[0], 6, false);
                bool vac7 = GetBit(vacSensors.cdata[0], 7, false);
                bool vac8 = GetBit(vacSensors.cdata[0], 8, false);

            }
            else
            {
                mAvail.Value = "UNAVAILABLE";
            }
        }
        internal void setmachinelock(bool LockStatus, ushort LockDBit = 0, ushort MsgDBit = 0, ushort UnLockDBit = 0)
        {
            Focas1.focas_ret retallclibhndl3 = (Focas1.focas_ret)Focas1.cnc_allclibhndl3(ip, port, timeout, out h);
            if (LockStatus)
            {
                //UnLocking D Bit Parameters
                var    rdpmcdataUnLockBit = new Focas1.IODBPMC0();
                short  adr_typeUn         = 9;
                short  data_typeUn        = 0;
                ushort s_numberUn         = UnLockDBit;
                ushort e_numberUn         = UnLockDBit;
                ushort lengthUn           = 9;

                short rdretUnLock = Focas1.pmc_rdpmcrng(h, adr_typeUn, data_typeUn, s_numberUn, e_numberUn, lengthUn, rdpmcdataUnLockBit);

                var wrpmcdataUn = rdpmcdataUnLockBit;
                wrpmcdataUn.cdata[0] = 0;
                for (int i = 0; i < 100; i++)
                {
                    short wrret = Focas1.pmc_wrpmcrng(h, lengthUn, wrpmcdataUn);
                    if (wrret == 0)
                    {
                        break;
                    }
                }

                //Locking D Bit Parameters
                var    rdpmcdataLockBit = new Focas1.IODBPMC0();
                short  adr_type         = 9;
                short  data_type        = 0;
                ushort s_number         = LockDBit;
                ushort e_number         = LockDBit;
                ushort length           = 9;

                short rdretLock = Focas1.pmc_rdpmcrng(h, adr_type, data_type, s_number, e_number, length, rdpmcdataLockBit);

                //IdleMessage D Bit Parameters
                var    rdpmcdataIdleBit = new Focas1.IODBPMC0();
                short  adr_typeIdle     = 9;
                short  data_typeIdle    = 0;
                ushort s_numberIdle     = MsgDBit;
                ushort e_numberIdle     = MsgDBit;
                ushort lengthIdle       = 9;

                short rdretIDLE = Focas1.pmc_rdpmcrng(h, adr_typeIdle, data_typeIdle, s_numberIdle, e_numberIdle, lengthIdle, rdpmcdataIdleBit);

                //Machine LOCK D Bit
                var wrpmcdata = rdpmcdataLockBit;
                wrpmcdata.cdata[0] = 1;
                for (int i = 0; i < 10; i++)
                {
                    short wrretLOCK = Focas1.pmc_wrpmcrng(h, length, wrpmcdata);
                }

                if (MsgDBit != 0)
                {
                    //IDLE Message D Bit
                    var wrpmcdataIDLE = rdpmcdataIdleBit;
                    wrpmcdataIDLE.cdata[0] = 1;
                    for (int i = 0; i < 10; i++)
                    {
                        short wrretIDLE = Focas1.pmc_wrpmcrng(h, length, wrpmcdataIDLE);
                    }

                    wrpmcdataIDLE.cdata[0] = 0;
                    for (int i = 0; i < 10; i++)
                    {
                        short wrretIDLE = Focas1.pmc_wrpmcrng(h, length, wrpmcdataIDLE);
                    }
                }

                Thread.Sleep(2000);
                //Lock D Bit reverted back to OFF State
                rdretLock = Focas1.pmc_rdpmcrng(h, adr_type, data_type, s_number, e_number, length, rdpmcdataLockBit);
                var wrpmcdata1 = rdpmcdataLockBit;
                wrpmcdata1.cdata[0] = 0;
                for (int i = 0; i < 10; i++)
                {
                    short wrret = Focas1.pmc_wrpmcrng(h, length, wrpmcdata1);
                }
            }
            else
            {
                //UnLocking D Bit Parameters
                var    rdpmcdataLockBit = new Focas1.IODBPMC0();
                short  adr_type         = 9;
                short  data_type        = 0;
                ushort s_number         = LockDBit;
                ushort e_number         = LockDBit;
                ushort length           = 9;

                short rdretLock = Focas1.pmc_rdpmcrng(h, adr_type, data_type, s_number, e_number, length, rdpmcdataLockBit);

                var wrpmcdata1 = rdpmcdataLockBit;
                wrpmcdata1.cdata[0] = 0;
                for (int i = 0; i < 100; i++)
                {
                    short wrret = Focas1.pmc_wrpmcrng(h, length, wrpmcdata1);
                    if (wrret == 0)
                    {
                        break;
                    }
                }
            }
        }
Пример #20
0
        /// <summary>
        /// 读取指定pmc地址的内容
        /// </summary>
        /// <param name="address"></param>
        public void ReadPmc(string address)
        {
            try
            {
                string addressKindStr = address.Substring(0, 1);
                int    addressKindInt = 0;
                int    addressNo      = int.Parse(address.Substring(1, 4).TrimStart('0') == "" ? "0" : address.Substring(1, 4).TrimStart('0'));
                for (int i = 0; i < pmcAddress.Keys.Count; i++)
                {
                    if (pmcAddress[i].ToString() == addressKindStr)
                    {
                        addressKindInt = i;
                        break;
                    }
                }
                short  a     = Convert.ToInt16(addressKindInt);
                short  b     = 0;
                ushort start = Convert.ToUInt16(addressNo);
                ushort end   = Convert.ToUInt16(addressNo + 1);
                ushort f     = 0;
                ushort N     = (ushort)(end - start + 1);
                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;
                }
                Fanuc.IODBPMC0 iodbpmc0 = new Focas1.IODBPMC0();
                int            ret      = Fanuc.pmc_rdpmcrng(Fanuc.h, a, b, start, end, f, iodbpmc0);
                if (ret == Fanuc.EW_OK)
                {
                    byte[] data = iodbpmc0.cdata;
                    int    j    = 0;
                    for (ushort i = start; i < end; i++, j++)
                    {
                        string add   = Fanuc.getpmcadd(iodbpmc0.type_a, i);
                        int    value = Convert.ToInt32(Convert.ToString(data[j], 16).ToString());
                        string temp  = Convert.ToString(value, 2).PadLeft(8, '0');
                        char[] chars = temp.ToCharArray();

                        textBox9.Text = chars[7].ToString();
                        textBox8.Text = chars[6].ToString();
                        textBox7.Text = chars[5].ToString();
                        textBox6.Text = chars[4].ToString();
                        textBox5.Text = chars[3].ToString();
                        textBox4.Text = chars[2].ToString();
                        textBox3.Text = chars[1].ToString();
                        textBox2.Text = chars[0].ToString();
                    }
                }
                else
                {
                    MessageBox.Show(ret + "");
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("输入的地址错误,详细:" + e.ToString());
            }
        }
Пример #21
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));
        }