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); }
//进给倍率 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); }
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 + ""); } }
//写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); } }
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 + ""); } }
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); }
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); }
//写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); } }
//写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); } }
//返回-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); } }
//进给倍率 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); }
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); }
//读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); } }
/// <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()); } }
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); }
/// <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)); } }
//------------------------------------------------------------------------------------------------------------------// //---------------------------------- 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; } } } }
/// <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()); } }
//读取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)); }