private string WritePmcWord(ushort flib, short adr_type, ushort adr, string data) { short itemp; bool ret_b = short.TryParse(data, out itemp); if (ret_b == false) { return("写入PMC信号失败,数据格式错误"); } Focas1.IODBPMC1 buf = new Focas1.IODBPMC1(); buf.idata = new short[5]; buf.idata[0] = itemp; buf.datano_s = (short)adr; buf.datano_e = (short)(adr + 1); buf.type_a = adr_type; buf.type_d = 1; var ret = Focas1.pmc_wrpmcrng(flib, 10, buf); if (ret != 0) { return($"写入PMC信号失败,返回:{ret}"); } return(null); }
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 + ""); } }
//读取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)); }