三菱CNC数采超详细,资料全备教程,后续更新发那科数采教程

三菱数采详细教程

一、介绍

1.背景

​ 这是我在接手MES系统的生产采集功能时,花费巨大心血,才掌握的应该设备采集数据的教程。如果你也因为网上教程太杂,而且不附带资源,那么你就找对了文档,本篇文档1w字数,制作不易,请点赞收藏

2.需要掌握知识

​ C#,winform这个语言有基本的语法掌握,Mysql语言要学会增删改操作,VS工具的使用,连接mysql的步骤我暂时还没完成,本篇文章后续会将mysql数据库连接更新进来的

3.需要资料
①三菱SDK包:A2

​ 下载地址:三菱CNC数据采集与驱动A2协议手册:三菱CNC数据采集与驱动A2协议手册欢迎使用《三菱CNC - 三菱数控系统 - 数据采集 - 驱动 - A2驱动,协议手册》 - GitCode

​ 下载后一路下一步安装,遇到需要解锁的激活码时,就在A2包里面的,SN.txt文本里面

②三菱com接口文档

​ FCSB1224W000PDF文档

③C#代码:

​ SimCNC-master

④VStudio

​ 浏览器直接搜索下载,不过vs下载时要注意下载包含winform的负载包
在这里插入图片描述

⑤资料存放网盘

​ 这些我全都放在我的百度网盘里面,这个是网盘的地址大家可以自己去下载,但是vs这个需要自己去网上安装。

​ 通过百度网盘分享的文件:三菱设备采集教程
​ 链接:https://pan.baidu.com/s/1RRG-sKQcYtK_1q9sNR1Qyw?pwd=love
​ 提取码:love

二、程序运行

1.调试设备
①条件

​ 你需要调试三菱的设备IP让其可以被ping通

​ 还要确保你和三菱机床要是同一个网段下

②命令

​ –ipconfig

​ 电脑在命令窗口使用 ipconfig查看IPV4的地址,来确定自己电脑在哪一个网段。

​ 我用虚拟机的,网卡设备太多,不过大家电脑就不会这么多,一眼就能看到自己所在网段
在这里插入图片描述

​ –arp -a

​ 电脑在命令窗口使用 arp -a查看这个网段下面存活的设备
在这里插入图片描述

​ –设置设备IP

​ 确定好设备可以使用的IP后,就去设置CNC机床的IP,这是一个调试设备IP的文档:

机床数据采集之Mitsubishi三菱M70/M80数控IP地址参数设定_三菱m70以太网设定教程-CSDN博客

2.运行软件
①打开软件

​ 双击打开会让你选择打开软件,我们选择vs2022这个紫色图标就行了
在这里插入图片描述

②运行程序

​ 运行起来后,就直接按连接按钮,看看是否能够采集到数据就行了
在这里插入图片描述
在这里插入图片描述

三、数据采集

1.代码了解

注意:ctrl+鼠标单击进入,我截图有一个文字写错了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

​ 进入后我们就能看到一堆COM接口的方法,我们并不清楚文档里面方法是干嘛,这时候我们就需要打开PFf的参考手册了

2.参考手册

​ 打开FCSB1224W000PDF 参考手册PDF文件
在这里插入图片描述

3.采集案例
①找需要的数据

​ 我们从参考手册里面找到我们要采集的数据,例如AliveTime
在这里插入图片描述

②找接口方法

​ --我们在代码里面找到我们手册里面的的接口方法

​ --我们能看到返回的是int的数据,然后要传入一个out int plTime的参数

​ --int不解释了,这个out就是值传递意思,从外部传入的值,在里面值发生改变会传递到外部

在这里插入图片描述

③实现方法

​ --因为我们的界面中调用的都是MitCom类中的方法,所以我们要在这个类写个方法

​ --完成后可以在我们的代码中通过mitCom对象调用了

 /**
  * 获取电源开启到关闭的时间
  */
 public void GetRunAliveTime(out int plTime)
 {
     //初始化运行时间为0,会因为out而修改掉
     plTime = 0;
     try
     {
         if (EZNcCom != null)
         {
             lResult = EZNcCom.Time_GetAliveTime(out plTime);
             ErrorCheck("GetRunAliveTime");
         }
     }
     catch
     {
         ErrorCheck("通讯已关闭");
     }
 }

四、代码思路

1.总结代码

​ --我的代码全部总结出来,其实就四个内容

在这里插入图片描述

2.初始化
①思路

​ --初始化连接池

​ --初始化零件加工循环时间判断类

​ --装载连接IP的容器创建

​ --在程序执行时会执行无参构造方法,在立马初始化表格头,还有连接池的连接对象,和循环时间判断类装载

​ --优化思路:把三菱的连接池,包括其他的需要初始化的数据,全部放到一个类中,写成对象数组

②代码
#region 初始化相关内容
//--------------------------------------------
//懒得写个对象数组了,大家想优化可以自己写
//int connCount = 0;//连接池初始化的次数,用来防止频繁创建连接
List<EZSockets.MitCom> mitComs = new List<EZSockets.MitCom>();//模拟连接池

//零件加工循环时间判断类
List<PartCycleTimeChecker> pctCheckers = new List<PartCycleTimeChecker>();//
//---------------------------------------------

//获取连接IP的数据
List<String> nodes = new List<string>();

public MultipleMitForm()
{
    InitializeComponent();

    init();

    //初始化连接个数
    //默认初始化连接个数 10个
    connectionInit(10);
}

public void init()
{
    //设置列名
    dataGridView1.Columns.Clear();
    dataGridView1.Columns.Add("version", "版本信息:");
    dataGridView1.Columns.Add("aliveTime", "设备状态:");
    dataGridView1.Columns.Add("processCount", "零件加工总数:");
    dataGridView1.Columns.Add("waringMessage", "告警信息:");
    dataGridView1.Columns.Add("runTime", "运行时间:");
    dataGridView1.Columns.Add("runStatus", "运行状态:");
    dataGridView1.Columns.Add("CNCTime", "机床加工时间:");
    dataGridView1.Columns.Add("processTime", "目前零件加工时间:");
    // 设置列宽
    dataGridView1.Columns["processCount"].Width = 130; // 设置宽度为 100 像素
    dataGridView1.Columns["waringMessage"].Width = 150; // 设置宽度为 100 像素
    dataGridView1.Columns["CNCTime"].Width = 130; // 设置宽度为 100 像素
    dataGridView1.Columns["processTime"].Width = 150; // 设置宽度为 100 像素

}
#endregion
3.连接方法
①思路

​ --这个初始化连接的详细方法

​ --进行输入连接地址的获取方法

​ --点击连接按钮进行连接事件

​ --连接数修改的方法

​ --防止窗口关闭忘记断开连接的的方法

②代码
 #region 连接相关方法群
 //初始化连接池
 public void connectionInit(int connCount)
 {
     //清空连接池
     mitComs.Clear();

     // 设置连接数的文本信息
     this.formMitConnSum.Text = "" + connCount;
     //设置更新连接数判断参数 发生变化时用来比对
     updateConneSum = connCount;

     //默认初始化连接个数 10个
     for (int i = 1; i <= connCount; i++)
     {
         EZSockets.MitCom mitCom = new MitCom();
         mitComs.Add(mitCom);

         PartCycleTimeChecker pctCheck = new PartCycleTimeChecker();
         pctCheckers.Add(pctCheck);
     }
     Console.WriteLine("connectionInit:" + mitComs.Count);
 }

 // 方法:获取每行文本并填充集合
 private List<string> GetLinesFromTextBox(TextBox textBox)
 {
     // 创建一个集合来存放每一行文本
     List<string> lines = new List<string>();

     // 将多行文本框的内容按行分割
     foreach (string line in textBox.Lines)
     {
         // 添加到集合
         if (!string.IsNullOrWhiteSpace(line)) // 检查非空行
         {
             lines.Add(line);
         }
     }
     return lines; // 返回包含每行文本的集合
 }


 private void Connect_Click(object sender, EventArgs e)
 {
     //读取你输入IP作为一个数组
     nodes = GetLinesFromTextBox(nodeNames);

     //连接状态
     string connStatus = Connect.Text;

     string version = "";
     int pvValue;

     //非空判断,IP输入数不合理判断
     if (nodes.Count < 1)
     {
         MessageBox.Show("请输入IP", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
         return;
     }

     //连接数判断 为false 就进入判断结束方法
     if (!connectionCountChanged())
     {
         return;
     }

     try
     {
         if (connStatus == "连接")
         {
             //连接状态禁止修改
             nodeNames.ReadOnly = true;
             formMitConnSum.ReadOnly = true;

             for (int i = 0; i < nodes.Count; i++)
             {
                 //初始化连接池的连接
                 mitComs[i].GetSimConnect("M700M", "" + i + 1, TimeOut.Text, nodes[i]);//连接三菱设备
                 Connect.Text = "断开";
             }

             //读取一下数据
             readData();
         }

         if (connStatus == "断开")
         {
             //清除表格旧数据
             readCount = 0;
             dataGridView1.Rows.Clear();

             //连接状态禁止修改
             nodeNames.ReadOnly = false;
             formMitConnSum.ReadOnly = false;
             for (int i = 0; i < nodes.Count; i++)
             {
                 version = "";
                 //断开指定连接
                 //初始化连接池的连接
                 mitComs[i].GetSimConnect("M700M", "" + i + 1, TimeOut.Text, nodes[i]);//连接三菱设备

                 //初始化标记是否可以计数
                 pctCheckers[i].RunCount = 0;

                 Connect.Text = "连接";
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show($" 连接/断开 过程中出现错误: {ex.Message}");
     }

 }

 //连接数修改方法
 int updateConneSum = 0;

 bool connectionCountChanged()
 {
     Console.WriteLine("连接池个数:" + mitComs.Count);
     Console.WriteLine("连接个数:" + nodes.Count);
     

     bool flag = true;
     // 尝试解析输入内容,符合整数才能继续判断
     if (int.TryParse(formMitConnSum.Text, out int connectionCount))
     {
         //检查输入IP个数是否超出设定连接数据 
         if (nodes.Count > Convert.ToInt32(mitComs.Count) )
         {
             MessageBox.Show("检查输入IP个数是否超出设定连接数据", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
             flag = false;
         }
         

         //当连接数发生变化时,就修改连接数
         if(Convert.ToInt32(formMitConnSum.Text) > updateConneSum)
         {
             Console.WriteLine("连接数发生修改:"+ connectionCount);
             updateConneSum = Convert.ToInt32(formMitConnSum.Text);
             // 修改连接池个数
             connectionInit(Convert.ToInt32(formMitConnSum.Text));
         }
     }
     else
     {
         // 输入无效的情况,可提示用户
         MessageBox.Show("请输入有效的连接数", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
         // 此行可以选用取消输入或清空内容
         // connectionSum.Clear(); // 可选
         flag = false;
     }

     return flag;
 }

 //窗体关闭前先关闭连接
 private void MultipleMitForm_FormClosing(object sender, FormClosingEventArgs e)
 {
     Console.WriteLine("窗口关闭前!!!!!!!!!!!!!!!!");
     if (Connect.Text == "断开")
     {
         Connect_Click(sender, e);
     }
 }

 private void MultipleMitForm_FormClosed(object sender, FormClosedEventArgs e)
 {
     Console.WriteLine("窗口关闭后!!!!!!!!!!!!!!!!");
     if (Connect.Text == "断开")
     {
         Connect_Click(sender, e);
     }
 }

 #endregion
4.获取信息方法
①思路

​ --首先找到接口文档手册,查阅到需要的方法

​ --然后去找到通讯类中的接口,进行调用,忘记的可以到三、数据采集去看看

​ --我们可以看看三菱官方写的MitCom类中有没有大家需要的方法

​ --假设没有,我们就需要在MitCom中创建好,然后在页面中进行调用

②案例

​ --假设我们要写一个获取电源时间的,且MitCom中没有

​ --1.我们按照标题三、数据采集的方法找到这个方法

​ --2.在MitCom完成方法的实现

​ --3.在我们的界面中进行调用,以及修改表格展示初始化,和表格数据的读取

​ --4.代码中要修改的地方

添加列名到表格

dataGridView1.Columns.Add("aliveTime", "电源时间:");

添加数据表表格行

dataGridView1.Rows.Add(GetAliveTime(mitComs[i]));

循环读取内容时,进行修改表格数据

row.Cells[0].Value = GetAliveTime(mitComs[i]);

1..在我们的界面中进行调用
		/// <summary>
        /// 获取电源运行时间
        /// </summary>
        string GetAliveTime(EZSockets.MitCom mitCom)
        {
            int plTime;

            mitCom.GetRunAliveTime(out plTime);

            if (plTime > 0)
            {
                return "在线";
            }
            else
            {
                return "离线";
            }
        }
		
2.以及修改表格展示初始化
        public void init()
        {
            //设置列名
            dataGridView1.Columns.Clear();
            dataGridView1.Columns.Add("aliveTime", "电源时间:");
        }

3.表格数据的读取
 //读取需要的数据
 int readCount = 0; //表格读取次数
 public void readData()
 {
     //获取连接IP的数据
     List<String> nodes = GetLinesFromTextBox(nodeNames);

     this.BeginInvoke((MethodInvoker)delegate ()
     {
         Console.WriteLine("表格读取次数:" + readCount);
         Console.WriteLine("表格行数:" + dataGridView1.RowCount);
         //如果
         if (readCount == 0 && dataGridView1.RowCount <= 1)
         {
             //清除表格行数据
             dataGridView1.Rows.Clear();
             for (int i = 0; i < nodes.Count; i++)
             {
                 //,GetCount(mitComs[i])
                 dataGridView1.Rows.Add(GetAliveTime(mitComs[i]));
                 readCount++;
             }
         }
         else
         {
             //清除表格行数据
             for (int i = 0; i < nodes.Count; i++)
             {
                 // 更新已有行
                 DataGridViewRow row = dataGridView1.Rows[i];
                 row.Cells[0].Value = GetAliveTime(mitComs[i]);
             }
         }
     });
 }
③代码
#region 获取信息的方法群
/// <summary>
/// 获取零件运行时间
/// </summary>
string GetEstimateTime(EZSockets.MitCom mitCom, PartCycleTimeChecker pctChecker)
{ 
    //获取当前运行状态
    string stauts = GetRunStatus(mitCom);

    // 获取当前时间
    DateTime now = DateTime.Now;
    // 将时、分、秒转换为总秒数
    int currentTime = (now.Hour * 3600) + (now.Minute * 60) + now.Second;

    //新的一轮开始判断
    if(stauts == "未运行")
    {
        //判断是否为新的一轮
        if (pctChecker.RunCycle)
        {
            //标记为下一轮可以开始计数
            pctChecker.RunCount = 1;
            //runCount++;
            Console.WriteLine("成功标记下一次可以开始计数:" + pctChecker.RunCount);
        }
        else 
        {
            //如果是新的一轮
            //标记为下一轮可以开始计数
            pctChecker.RunCount = 1;
            Console.WriteLine("成功标记下一次可以开始计数:" + pctChecker.RunCount);

            //重置循环时间和零件加工时间为0
            pctChecker.RunStartTime = 0;

            //关闭新一轮开始按钮
            pctChecker.RunCycle = false;
        }
    }
    
    if (stauts == "运行中" && pctChecker.RunCount == 1) 
    {
        //设定只能修改一次,然后下一次零件加工开始时间刷新
        //首先设定程序的开始时间
        if (pctChecker.RunStartTime == 0) 
        {
            pctChecker.CountTime = 0;
            pctChecker.RunStartTime = currentTime;
        }


        //循环时间 = 当前时间 - 开始运行的时间
        pctChecker.CountTime = currentTime - pctChecker.RunStartTime;
        Console.WriteLine("成功进入查看循环时间:" + pctChecker.CountTime);
    }

    return ""+ pctChecker.CountTime;
}

/// <summary>
/// 获取运行状态
/// </summary>
string GetRunStatus(EZSockets.MitCom mitCom)
{
    int status;

    mitCom.GetRunStatus(1,out status);

    if (status == 0)
    {
        return "未运行";
    }
    else 
    {
        return "运行中";
    }
}

/// <summary>
/// 获取自启动时间
/// </summary>
string GetStartTime(EZSockets.MitCom mitCom)
{
    int plTime;

    mitCom.GetStartTime(out plTime);

    return plTime.ToString();
}

/// <summary>
/// 获取运行时间
/// </summary>
string GetRunTime(EZSockets.MitCom mitCom)
{
    int plTime;

    mitCom.GetRunTime(out plTime);

    return plTime.ToString();
}


/// <summary>
/// 获取NC系统报警
/// </summary>
string GetNCAlarm(EZSockets.MitCom mitCom)
{
    string[] alarmMsgs;
    string alarmMsg = "";
    mitCom.GetAlarm(out alarmMsgs);
    alarmMsg = "{ ";
    for (int i = 0; i < alarmMsgs.Length; i++)
    {
        if (alarmMsgs[i] != "" && alarmMsgs[i] != null)
        {
            alarmMsg = alarmMsg + alarmMsgs[i] + ", ";

        }

    }
    alarmMsg = alarmMsg + " }";
    return alarmMsg;
}

/// <summary>
/// 获取电源运行时间
/// </summary>
string GetAliveTime(EZSockets.MitCom mitCom)
{
    int plTime;

    mitCom.GetRunAliveTime(out plTime);

    if (plTime > 0)
    {
        return "在线";
    }
    else
    {
        return "离线";
    }
}

/// <summary>
/// 统计件数
/// </summary>
string GetCount(EZSockets.MitCom mitCom)
{
    string pvValue;
    mitCom.GetParaValue(30, 8002, 1, 1, out pvValue);
    return pvValue;
}

/// <summary>
/// 版本型号信息
/// </summary>
string GetVersion(EZSockets.MitCom mitCom)
{
    string version;
    mitCom.GetSimVersion(1, 0, out version);//获取版本
    return version;
}
#endregion
5.读取信息
①思路

​ --我们开启定时器进行读取

​ --然后判断表格读取的次数,如果是大于0,就说明表格已经读取过了数据

​ --那么就不会添加,而是进行修改了

②代码
#region 数据读取的方法群
//刷新UI界面的数据
private void btn_refresh_Click(object sender, EventArgs e)
{
    readData();
}


//读取需要的数据
int readCount = 0; //表格读取次数
public void readData()
{
    //获取连接IP的数据
    List<String> nodes = GetLinesFromTextBox(nodeNames);

    this.BeginInvoke((MethodInvoker)delegate ()
    {
        Console.WriteLine("表格读取次数:" + readCount);
        Console.WriteLine("表格行数:" + dataGridView1.RowCount);
        //如果
        if (readCount == 0 && dataGridView1.RowCount <= 1)
        {
            //清除表格行数据
            dataGridView1.Rows.Clear();
            for (int i = 0; i < nodes.Count; i++)
            {

                //,GetCount(mitComs[i])
                dataGridView1.Rows.Add(
                    GetVersion(mitComs[i]),
                    GetAliveTime(mitComs[i]),
                    GetCount(mitComs[i]),
                    GetNCAlarm(mitComs[i]),
                    GetRunTime(mitComs[i]),
                    GetRunStatus(mitComs[i]),
                    GetStartTime(mitComs[i]),
                    GetEstimateTime(mitComs[i], pctCheckers[i])
                    );
                readCount++;
            }
        }
        else
        {
            //清除表格行数据
            for (int i = 0; i < nodes.Count; i++)
            {
                // 更新已有行
                DataGridViewRow row = dataGridView1.Rows[i];
                row.Cells[0].Value = GetVersion(mitComs[i]);
                row.Cells[1].Value = GetAliveTime(mitComs[i]);
                row.Cells[2].Value = GetCount(mitComs[i]);
                row.Cells[3].Value = GetNCAlarm(mitComs[i]);
                row.Cells[4].Value = GetRunTime(mitComs[i]);
                row.Cells[5].Value = GetRunStatus(mitComs[i]);
                row.Cells[6].Value = GetStartTime(mitComs[i]);
                row.Cells[7].Value = GetEstimateTime(mitComs[i], pctCheckers[i]);

            }
        }
    });
}

//每秒执行的定时任务
private void timer2_Tick(object sender, EventArgs e)
{
    readData();
}

//开启读取按钮点击事件
private void readBtn_Click(object sender, EventArgs e)
{
    if (readBtn.Text == "开启读取")
    {
        //定时器开启
        refreshTimer.Enabled = true;
        readBtn.Text = "关闭读取";
        readFlag.Text = "开启";
    }
    else
    {
        refreshTimer.Enabled = false;
        readBtn.Text = "开启读取";
        readFlag.Text = "关闭";
    }
}
#endregion

如果看完后还有不懂的地方,可以来问博主

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值