自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类

文章目录

  • LTDMC.dll下载
  • LTDMC.cs LTDMC.dll C#调用封装下载
  • ICard.cs 运动控制卡接口
  • Card.cs 运动控制卡抽象类
  • CardLTDMC.cs 雷赛运动控制卡EtherCAT总线卡实现类
  • CardList.cs 总线卡列表封装


在这里插入图片描述

LTDMC.dll下载

最新的雷赛运动控制卡SDK,LTDMC.dll下载:
https://download.csdn.net/download/Mr_Wei_/88847834

LTDMC.cs LTDMC.dll C#调用封装下载

最新的雷赛运动控制卡SDK,LTDMC.cs带中文注释 下载:
https://download.csdn.net/download/Mr_Wei_/88847839

ICard.cs 运动控制卡接口

using System.Collections.Generic;

namespace iSystem
{
    public interface ICard
    {
        /// <summary>  
        /// 卡ID  
        /// </summary> 
        int CardID { get; set; }

        /// <summary>  
        /// 第几张卡  
        /// </summary> 
        int CardNo { get; set; }

        /// <summary>  
        /// 卡名称  
        /// </summary> 
        string CardName { get; set; }

        /// <summary>  
        /// 卡类型 0:2410 1:总线  
        /// </summary> 
        CardType CardType { get; set; }

        /// <summary>  
        /// 是否使用  
        /// </summary> 
        bool IsUsed { get; set; }

        /// <summary>  
        /// 是否初始化完成  
        /// </summary> 
        bool InitSucced { get; set; }

        /// <summary>
        /// 初始化
        /// </summary>
        /// <returns></returns>
        int Init();

        /// <summary>
        /// 关闭
        /// </summary>
        /// <returns></returns>
        int UnInit();

        /// <summary>
        /// 软复位
        /// </summary>
        /// <returns></returns>
        int SoftReset();

        /// <summary>
        /// 硬复位
        /// </summary>
        /// <returns></returns>
        int Reset();

        /// <summary>
        /// 获取总线卡错误代码
        /// </summary>
        /// <returns></returns>
        int GetErrCode();

        /// <summary>
        /// 清除总线卡错误代码
        /// </summary>
        /// <returns></returns>
        int ClearErrCode();

        /// <summary>
        /// 多轴插补
        /// </summary>
        /// <param name="lstMotor">电机列表</param>
        /// <param name="lstDist">目标位置</param>
        /// <param name="mode">移动模式</param>
        /// <returns></returns>
        bool MultMove(List<Motor> lstMotor, List<double> lstDist, int mode = 0, ushort crd = 0);

        /// <summary>
        /// 检测多轴运动是否停止
        /// </summary>
        /// <param name="crd"></param>
        /// <returns>0停止 1未停止</returns>
        int CheckMultMoveDone(ushort crd = 0);

        /// <summary>
        /// 等多轴运动停止
        /// </summary>
        /// <param name="OutTime">等待时间</param>
        /// <param name="crd"></param>
        /// <returns>是否超时</returns>
        bool WaitMultMoveDone(int OutTime, ushort crd = 0);
    }
}

Card.cs 运动控制卡抽象类

using System.Collections.Generic;

namespace iSystem
{
    public partial class Card : ICard
    {
        #region Properties

        /// <summary>  
        /// 卡ID  
        /// </summary> 
        public int CardID { get; set; } = 1;

        /// <summary>  
        /// 第几张卡  
        /// </summary> 
        public int CardNo { get; set; } = 0;

        /// <summary>  
        /// 卡名称  
        /// </summary> 
        public string CardName { get; set; } = "卡1";

        /// <summary>  
        /// 卡类型 0:2410 1:总线  
        /// </summary> 
        public CardType CardType { get; set; } = CardType.LS2410;

        /// <summary>  
        /// 是否使用  
        /// </summary> 
        public bool IsUsed { get; set; } = true;
        /// <summary>  
        /// 是否初始化完成  
        /// </summary> 
        public bool InitSucced { get; set; } = false;

        #endregion

        #region Constructors

        public Card()
        {

        }
        public Card(int cardID)
        {
            CardID = cardID;
        }

        public Card(Card model)
        {
            CardID = model.CardID;
            CardName = model.CardName;
            CardNo = model.CardNo;
            CardType = model.CardType;
            IsUsed = model.IsUsed;
            InitSucced = model.InitSucced;
        }

        #endregion

        #region Methods


        /// <summary>
        /// 初始化
        /// </summary>
        /// <returns></returns>
        public virtual int Init()
        {
            //int aa = Program.g_MachineType;
            return 0;
        }

        /// <summary>
        /// 关闭
        /// </summary>
        /// <returns></returns>
        public virtual int UnInit()
        {
            return 0;
        }
        /// <summary>
        /// 软复位
        /// </summary>
        /// <returns></returns>
        public virtual int SoftReset()
        {
            return 0;
        }

        /// <summary>
        /// 硬复位
        /// </summary>
        /// <returns></returns>
        public virtual int Reset()
        {
            return 0;
        }
        /// <summary>
        /// 获取总线卡错误代码
        /// </summary>
        /// <returns></returns>
        public virtual int GetErrCode()
        {
            return 0;
        }
        /// <summary>
        /// 清除总线卡错误代码
        /// </summary>
        /// <returns></returns>
        public virtual int ClearErrCode()
        {
            return 0;
        }
        /// <summary>
        /// 多轴插补
        /// </summary>
        /// <param name="lstMotor">电机列表</param>
        /// <param name="lstDist">目标位置</param>
        /// <param name="mode">移动模式</param>
        /// <returns></returns>
        public virtual bool MultMove(List<Motor> lstMotor, List<double> lstDist, int mode = 0, ushort crd = 0)
        {
            return false;
        }
        /// <summary>
        /// 检测多轴运动是否停止
        /// </summary>
        /// <param name="crd"></param>
        /// <returns>0停止 1未停止</returns>
        public virtual int CheckMultMoveDone(ushort crd = 0)
        {
            return 1;
        }
        /// <summary>
        /// 等多轴运动停止
        /// </summary>
        /// <param name="OutTime">等待时间</param>
        /// <param name="crd"></param>
        /// <returns>是否超时</returns>
        public virtual bool WaitMultMoveDone(int OutTime, ushort crd = 0)
        {
            bool result = false;
            return result;
        }


        #endregion
    }
}

CardLTDMC.cs 雷赛运动控制卡EtherCAT总线卡实现类

using System;
using System.Windows.Forms;

namespace iSystem
{
    public class CardLTDMC : Card
    {

        public CardLTDMC() : base()
        {
            //CardName = "DMC2410";
        }
        public CardLTDMC(int cardID) : base(cardID)
        {
            this.CardID = cardID;
        }

        public CardLTDMC(Card model) : base(model)
        {

        }
        /// <summary>
        /// 初始化电机卡
        /// </summary>
        /// <returns>返回卡数</returns>
        public override int Init()
        {
            int result = 0;
            InitSucced = false;
            try
            {
                result = LTDMC.dmc_board_init();
                ushort _num = 0;
                ushort[] cardids = new ushort[8];
                uint[] cardtypes = new uint[8];
                short res = LTDMC.dmc_get_CardInfList(ref _num, cardtypes, cardids);
                if (result > 0)
                    InitSucced = true;
            }
            catch (Exception ex)
            {
                string msg = "电机卡初始化失败!" + ex;
                MessageBox.Show(msg);
                result = 0;
                //throw;
            }

            return result;
        }

        /// <summary>
        /// 关闭电机卡
        /// </summary>
        /// <returns></returns>
        public override int UnInit()
        {
            int result = 1;
            try
            {
                LTDMC.dmc_board_close();
                InitSucced = false;
            }
            catch (System.Exception ex)
            {
                string msg = "电机卡卸载失败!" + ex;
                MessageBox.Show(msg);
                result = 0;
            }
            return result;
        }
        public override int SoftReset()
        {
            int result = 1;
            result = LTDMC.dmc_soft_reset((ushort)CardNo);
            //UnInit();
            //for (int i = 0; i < 15; i++)//总线卡软件复位耗时15s左右
            //{
            //    Application.DoEvents();
            //    Thread.Sleep(1000);
            //}
            //Init();

            return result;
        }

        /// <summary>
        /// 获取总线卡错误
        /// </summary>
        /// <returns>0正常,其它值出错</returns>
        public override int GetErrCode()
        {
            ushort errCode = 0;
            LTDMC.nmc_get_errcode((ushort)CardNo, 2, ref errCode);
            return errCode;
        }
        /// <summary>
        /// 清除总线卡错误代码
        /// </summary>
        /// <returns></returns>
        public override int ClearErrCode()
        {
            short errCode = 0;
            errCode = LTDMC.nmc_clear_errcode((ushort)CardNo, 2);
            return errCode;
        }




    }
}

CardList.cs 总线卡列表封装


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace iSystem
{
    public class CardList
    {
        private static readonly string ConfigPath = $@"{GlobalData.ConfigDir}card.json";

        public static Dictionary<int, Card> Devs = new Dictionary<int, Card>();
        public static ushort CardID=0;

        /// <summary>
        /// 初始化文件
        /// </summary>
        public static void InitJsonFile()
        {
            //Devs.Add(0, new CardDMC2410(0));
            //Devs.Add(1, new CardDMC2410(1));
            //Devs.Add(2, new CardDMC2410(2));
            //Devs.Add(3, new CardDMC2410(3));
            Devs.Add(0, new CardLTDMC(0));
            Save();
        }

        /// <summary>
        /// 加载
        /// </summary>
        public static void Load()
        {
            if (!File.Exists(ConfigPath))
            {
                InitJsonFile();
            }
            Devs = Loader.LoadFromJson<Dictionary<int, Card>>(ConfigPath);

        }

        /// <summary>
        /// 初始化电机卡
        /// </summary>
        /// <returns>返回卡数</returns>
        public static void Init()
        {
            IsInitSucceed = false;
            try
            {
                int num = LTDMC.dmc_board_init();
                if (num <= 0 || num > 8)
                {
                    //UIHelper.ShowError("电机卡初始化失败!");
                }
                ushort _num = 0;
                ushort[] cardids = new ushort[8];
                uint[] cardtypes = new uint[8];
                short res = LTDMC.dmc_get_CardInfList(ref _num, cardtypes, cardids);
                if (num > 0)
                {
                    IsInitSucceed = true;
                    CardID = cardids[0];
                }
            }
            catch (Exception ex)
            {
                string msg = "电机卡初始化失败!" + ex.Message;
                UIHelper.ShowErrorForm(msg);
            }

        }

        /// <summary>
        /// 硬复位
        /// </summary>
        /// <returns></returns>
        public static async Task<bool> Reset()
        {
            Logger.Info("总线卡硬件复位进行中……");
            LTDMC.dmc_board_reset();
            LTDMC.dmc_board_close();

            for (int i = 15; i > 0; i--)//总线卡硬件复位耗时15s左右
            {
                Application.DoEvents();
                await Task.Delay(1000);
                Logger.Info($"总线卡硬复位……{i}s");
            }
            //MotorListForm.Instance.HideWaitForm();


            LTDMC.dmc_board_init();
            Logger.Info("总线卡硬件复位完成,请确认总线状态");

            ushort errcode = 0;
            LTDMC.nmc_get_errcode(CardID, 2, ref errcode);
            if (errcode == 0)
            {
                Logger.Info("EtherCAT总线正常");
                return true;
            }
            else
            {
                Logger.Error($"EtherCAT总线出错 errcode:{errcode}");
                return false;
            }
        }

        /// <summary>
        /// 软复位
        /// </summary>
        /// <returns></returns>
        public static async Task<bool> SoftReset()
        {
            Logger.Info("总线卡软件复位进行中……");
            LTDMC.dmc_soft_reset(CardID);
            LTDMC.dmc_board_close();
            ushort errcode = 0;
            for (int i = 15; i > 0; i--)//总线卡软复位耗时15s左右
            {
                Application.DoEvents();
                await Task.Delay(1000);
                Logger.Info($"总线卡软复位……{i}s");
                
                //LTDMC.nmc_get_errcode(CardID, 2, ref errcode);
                //if (errcode == 0)
                //{
                //    break;
                //}
            }

            LTDMC.dmc_board_init();
            Logger.Info("总线卡软复位完成,请确认总线状态");

            LTDMC.nmc_get_errcode(CardID, 2, ref errcode);
            if (errcode == 0)
            {
                Logger.Info("EtherCAT总线正常");
                return true;
            }
            else
            {
                Logger.Error($"EtherCAT总线出错:{errcode}");
                return false;
            }
        }

        /// <summary>
        /// 获取总线状态
        /// </summary>
        /// <returns></returns>
        public static bool GetStatus()
        {
            ushort errcode = 0;
            LTDMC.nmc_get_errcode(0, 2, ref errcode);
            return errcode == 0;
        }

        /// <summary>
        /// 直线插补相对运动
        /// </summary>
        public static bool LineOffset(IMotor aMotor, IMotor bMotor, double aDist, double bDist)
        {
            if (!CardList.IsInitSucceed)
                return false;

            ushort[] AxistList = new[] { aMotor.AxisNo, bMotor.AxisNo };
            double[] Target_Pos = new double[] { aDist, bDist };
            ushort mode = 0;
            ushort crd = 0;

            LTDMC.dmc_set_vector_profile_unit(aMotor.CardNo, 0, aMotor.MinSpeed, aMotor.MaxSpeed, aMotor.AccTime, aMotor.DecTime, 100);
            LTDMC.dmc_line_unit(aMotor.CardNo, crd, 2, AxistList, Target_Pos, mode);

            while (LTDMC.dmc_check_done_multicoor(aMotor.CardNo, crd) == 0)
            {
                Application.DoEvents();
            }
            return true;
        }

        /// <summary>
        /// 直线插补绝对运动
        /// </summary>
        public static bool LineTo(IMotor aMotor, IMotor bMotor, double aDist, double bDist)
        {
            if (!CardList.IsInitSucceed)
                return false;

            ushort[] AxistList = new[] { aMotor.AxisNo, bMotor.AxisNo };
            double[] Target_Pos = new double[] { aDist, bDist };
            ushort mode = 1;
            ushort crd = 0;

            LTDMC.dmc_set_vector_profile_unit(aMotor.CardNo, 0, aMotor.MinSpeed, aMotor.MaxSpeed, aMotor.AccTime, aMotor.DecTime, 100);
            LTDMC.dmc_line_unit(aMotor.CardNo, crd, 2, AxistList, Target_Pos, mode);

            //while (LTDMC.dmc_check_done_multicoor(aMotor.CardNo, crd) == 0)
            //{
            //    Application.DoEvents();
            //}
            return true;
        }

        /// <summary>
        /// 检测插值运动是否停止
        /// </summary>
        public static bool CheckLineDone()
        {
            while (LTDMC.dmc_check_done_multicoor(0,0) == 0)
            {
                Application.DoEvents();
            }

            return (LTDMC.dmc_check_done_multicoor(0, 0) == 1);
        }

        /// <summary>
        /// 等多轴运动停止
        /// </summary>
        public bool WaitLineDone(int outTime)
        {
            return HiTimer.WaitCondition(CheckLineDone, outTime);
        }

        /// <summary>
        /// 紧急停止所有轴
        /// </summary>
        public void EmergentStop()
        {
            LTDMC.dmc_emg_stop(0);
        }

        /// <summary>
        /// 保存
        /// </summary>
        public static void Save()
        {
            Loader.SaveToJson(Devs, ConfigPath);
        }

        /// <summary>
        /// 卡初始化是否成功
        /// </summary>
        public static bool IsInitSucceed { get; set; }

        public static Card GetByKey(int key)
        {
            return Devs.ContainsKey(key) ? Devs[key] : null;
        }

        public static Card GetByIndex(int index)
        {
            return Devs[index];
        }

        public static int Count => Devs.Count();

        /// <summary>
        /// 卡0
        /// </summary>
        public static Card Card0 => Devs[0];

        / <summary>
        / 卡1
        / </summary>
        //public static Card DMC24101 => Devs[1];

        / <summary>
        / 卡2
        / </summary>
        //public static Card DMC24102 => Devs[2];

        / <summary>
        / 卡3
        / </summary>
        //public static Card DMC24103 => Devs[3];

    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/395052.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI公布阻止国家相关威胁行为者对人工智能的恶意使用(包括中国、朝鲜、伊朗、俄罗斯)

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述总结 简述 本篇幅公布OpenAI于2月14日公布的”阻止国家相关威胁行为者对人工智能的恶意使用“一文&#xff0c;其中提及到阻止并限制了来自&#xff08;包括中国、朝鲜、伊朗、俄罗斯&#xff09;的一些用户的使用&…

实习日志15

1.大改了一下界面 1.1.识别与验真 1.2.历史记录 2.改了几个bug 2.1.改json格式用JSON.stringify(value,null,2); 2.2.内嵌页面值与原页面值重复 2.3.验真条件判断 if (isVerifyCell.getValue() "不需要") {if (verifyResultCell.getValue() ! "未查验")…

IDEA实现序列化时如何自动生成serialVersionUID

实现步骤&#xff1a;1.安装GenerateSerialVersionUID插件 2.点击idea左上角File -> Settings -> Editor -> Inspections -> 搜索 Serialization issues &#xff0c;找到 Serializable class without ‘serialVersionUID’ ->打上勾&#xff0c;再点击Apply-&…

计算机功能简介:EC, NVMe

一 EC是指Embedded Controller 主要应用于移动计算机系统和嵌入式计算机系统中&#xff0c;为此类计算机提供系统管理功能。EC的主要功能是控制计算机主板上电时序、管理电池充电和放电&#xff0c;提供键盘矩阵接口、智能风扇接口、串口、GPIO、PS/2等常规IO功能&#xff0c;…

MySQL-锁(LOCK)

文章目录 1. 锁是什么&#xff1f;2. 全局锁2.1 相关语法2.2 特点 3. 表级锁3.1 表锁3.1.1 共享读锁&#xff08;S&#xff09;3.1.2 排它写锁&#xff08;X&#xff09; 3.2 元数据锁&#xff08;MDL&#xff09;3.2 意向锁&#xff08;IS、IX&#xff09; 4. 行级锁4.1 行锁 …

【力扣 - 二叉树的中序遍历】

题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 提示&#xff1a; 树中节点数目在范围 [0, 100] 内 -100 < Node.val < 100方法一&#xff1a;递归 思路与算法 首先我们需要了解什么是二叉树的中序遍历&#xff1a;按照访问左子树——…

【Linux系统化学习】深入理解文件系统(Ext2文件系统)

目录 前言 磁盘的物理结构 物理结构 磁头和盘片工作解析图 盘面区域划分图&#xff08;俯视盘面图&#xff09; 扇区的寻址、定位&#xff08;CHS定位&#xff09; 磁盘存储的逻辑抽象结构 LBA定址 文件系统 磁盘分区 EXT2文件系统 组块中的信息介绍 查看inode编号…

代码随想录算法训练营|二叉树总结

二叉树的定义&#xff1a; struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode* left,TreeNode* right):val(val),left(left),…

【Linux】软件包管理器 yum | vim编辑器

前言: 软件包管理器 yum和vim编辑器讲解 文章目录 软件包管理器 yum编辑器-vim四种模式普通模式批量化注释和批量化去注释末行模式临时文件 软件包管理器 yum yum&#xff08;Yellowdog Updater, Modified&#xff09;是一个在基于 RPM&#xff08;管理软件包的格式和工具集合&…

Smart Link和Monitor Link简介

定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#xff0c;它通过监控设备的上行接口…

Facebook Horizon:探索虚拟现实中的社交空间

随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正成为社交互动和娱乐体验的新前沿。在这个数字时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;正在引领虚拟社交的新时代&#xff0c;其推出的虚拟社交平台Facebook Horizon成为了…

手持三防平板丨国产化加固平板丨国产三防平板发展的意义是什么?

随着现代科技的快速发展&#xff0c;平板电脑在我们的生活中扮演着越来越重要的角色。然而&#xff0c;传统的平板电脑只能在普通的环境中使用&#xff0c;而无法在恶劣的环境中使用&#xff0c;例如在高海拔、高温、高湿度、沙漠等环境中&#xff0c;传统平板电脑往往会出现故…

自定义Linux登录自动提示语

设置提示语的方式 在Linux系统中&#xff0c;可以通过修改几个特定的文件来实现在用户登录时自动弹出提示语。以下是几个常用的方法&#xff1a; 1. 修改/etc/issue文件&#xff1a; 这个文件用于显示本地登录前的提示信息 sudo vi /etc/issue在项目合作的时候&#xff0c;…

Zoho Desk ‘24|了解客戶支持系統所有新的內容

Zoho Desk 是一款在線客戶工單管理系統&#xff0c;它的核心是以“客戶”爲宗旨&#xff0c;幫助企業從多種渠道爲客戶提供優質的售後服務支持&#xff0c;持續提升客戶滿意度和忠誠度。我們很榮幸地推出Zoho Desk 24,本篇文章我們將會介紹它的新功能以及更新地部分&#xff0c…

Shiro-11-web 介绍

配置 将Shiro集成到任何web应用程序的最简单方法是在web.xml中配置一个Servlet ContextListener和过滤器&#xff0c;该Servlet了解如何读取Shiro的INI配置。 INI配置格式本身的大部分是在配置页面的INI部分中定义的&#xff0c;但是我们将在这里介绍一些额外的特定于web的部…

linux基础学习(10):基本权限与相关命令

1.基本权限 用ls -l查看当前目录文件时&#xff0c;可以看到文件的基本权限 其由10位组成&#xff0c;其中&#xff1a; 第1位&#xff1a;代表文件类型。 - d lbc普通文件目录文件软链接文件块设备文件&#xff0c;也就是硬盘等存储设备的文件字符设备文件&#xff0c;是鼠…

嵌入式day24

开课复工啦~ 冲冲冲&#xff01; 文件IO&#xff1a; read函数和write函数&#xff1a; &#x1f4da; write 接口有三个参数&#xff1a; fd&#xff1a;文件描述符buf&#xff1a;要写入的缓冲区的起始地址&#xff08;如果是字符串&#xff0c;那么就是字符串的起始地址&…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十二章 常用工具函数 (Utils配置)

前言 在项目开发中&#xff0c;我们经常会使用一些工具函数&#xff0c;也经常会用到例如loadsh等工具库&#xff0c;但是这些工具库的体积往往比较大&#xff0c;如果项目本身已经引入了这些工具库&#xff0c;那么我们就没有必要再引入一次&#xff0c;所以我们需要自己封装…

基于JAVA+SpringBoot+Vue的前后端分离的电影院售票管理运营平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 该系统研究背景聚焦于…

【日常聊聊】深度学习进度

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;深度学习的基本原理和算法 方向二&#xff1a;深度学习的应用实例 方向三&#xff1a;深度学习的挑战和未…