自动化上位机开发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 Constructorspublic 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];}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能|机器学习——基于机器学习的舌苔检测

代码下载&#xff1a; 基于深度学习的舌苔检测毕设留档.zip资源-CSDN文库 1 研究背景 1.1.研究背景与意义 目前随着人们生活水平的不断提高&#xff0c;对于中医主张的理念越来越认可&#xff0c;对中医的需求也越来越多。在诊断中&#xff0c;中医通过观察人的舌头的舌质、苔…

C# 菜鸟级别有关于redis的使用

public IActionResult Index() { ConnectionMultiplexer _conn ConnectionMultiplexer.Connect("127.0.0.1:6379");//初始化 var database _conn.GetDatabase(7);//指定连接的库 0 RedisHelper redisHelper new Redi…

【react】react中和vue中的provide/inject、context写法示例

react写法 在 React 中&#xff0c;provide和inject的功能类似于 Vue.js 中的 provide和inject。它们都是用于跨组件层次传递数据的。 在 React 中&#xff0c;没有内置的 provide 和 inject 函数。但是&#xff0c;你可以使用 React 的 Context 来实现类似的功能。 Context…

基于STM32F407的coreJSON使用教程

目录 概述 工程建立 代码集成 函数介绍 使用示例 概述 coreJSON是FreeRTOS中的一个组件库&#xff0c;支持key查找的解析器&#xff0c;他只是一个解析器&#xff0c;不能生成json数据。同时严格执行 ECMA-404 JSON 标准。该库用 C 语言编写&#xff0c;设计符合 ISO C90…

grpc-go通过context传递额外数据

使用 ctx.Value 从 context 读取数据 // ValueFromIncomingContext returns the metadata value corresponding to the metadata // key from the incoming metadata if it exists. Key must be lower-case. // // # Experimental // // Notice: This API is EXPERIMENTAL and…

基于Java SSM框架实现生鲜食品o2o商城系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现生鲜食品o2o商城系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 生鲜食品o2o商城系统&#xff0c;主要的模块包括查看管理员&#xff1b;首页、个人中心、用户…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络&#xff0c;也称为多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff0c;是一种常见的神经网络模型&#xff0c;用于解决各种机器学习问题&#xff0c;包括分类和回归。BP 代表“反向传播”&#xff08;Backpropagation&#…

领域驱动设计(Domain Driven Design)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、场景和要求二、领域模型关键词1.领域2.子域3.通用语言4.限界上下文5.领域模型6.实体和值对象7.聚合根8.领域服务9.领域事件 总结 前言 Domain Driven Desi…

备战蓝桥杯---动态规划(应用1)

话不多说&#xff0c;直接看题&#xff1a; 首先我们考虑暴力&#xff0c;用二维前缀和即可&#xff0c;复杂度为o(n^4). 其实&#xff0c;我们不妨枚举任意2行&#xff0c;枚举以这个为边界的最大矩阵。 我们把其中的每一列前缀和维护出来&#xff0c;相当于把一个矩阵压缩成…

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK 全部学习汇总&#xff1a; g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 上面是涉及到的源代码&#xff0c;而这次需要分析的就是78、79行的两个中断。首先&#xff0c;需要确认NVIC_SYSPRI2寄存器的作用。 进一…

阿里云香港服务器是cn2吗?怎么测试?

阿里云服务器是CN2线路吗&#xff1f;云服务器BGP多线精品网络线路是cn2&#xff0c;香港轻量应用服务器不是cn2。 如何测试是不是中国电信cn2网络线路&#xff1f;可以本地公网 mtr 该公网IP地址看下是否走的CN2线路&#xff1a; 163骨干网出国的最后一跳IP开头是202.97CN2 …

PostgreSQL使用session_exec和file_fdw实现失败次数锁定用户策略

使用session_exec 、file_fdw以及自定义函数实现该功能。 缺陷&#xff1a;实测发现锁用户后&#xff0c;进去解锁特定用户。只能允许一次登陆&#xff0c;应该再次登陆的时候&#xff0c;触发函数&#xff0c;把之前的日志里的错误登陆的信息也计算到登录次数里了。而且foreig…

macOS上使用VScode编译配置C++语言开发环境

本文介绍macOS上使用VScode编译配置C语言开发环境 1.准备工作 安装C/C插件 2.配置c_cpp_properties.json文件 [⇧⌘P]打开命令模式&#xff0c;选择[C/Cpp: Edit Configurations(JSON)]命令&#xff0c;回车后会自动生成一个.vscode目录&#xff0c;目录下有一个c_cpp_prope…

算法-链表操作

题目 1&#xff09;输入链表头节点&#xff0c;奇数长度返回中点&#xff0c;偶数长度返回上中点 2&#xff09;输入链表头节点&#xff0c;奇数长度返回中点&#xff0c;偶数长度返回下中点 3&#xff09;输入链表头节点&#xff0c;奇数长度返回中点前一个&#xff0c;偶数长…

SpringBoot支持哪些日志框架?推荐和默认的日志框架是哪个?

文章目录 一、介绍1、支持的类型2、日志级别 二、实战1、logback2、Log4j2 三、总结 一、介绍 1、支持的类型 SpringBoot支持多种日志框架&#xff0c;包括Logback、Log4j2和Java Util Logging&#xff08;JUL&#xff09;。默认情况下&#xff0c;如果你使用SpringBoot的sta…

数学在现代经济学研究中的作用

数学在现代经济学研究中的作用 The Role of Mathematics in Modern Economic Research 经济学&#xff0c;作为一门研究人类如何在资源有限的情况下做出选择的社会科学&#xff0c;历来都与数学有着紧密的联系。随着科技的发展&#xff0c;特别是在信息时代数据量的爆炸性增长&…

【漏洞复现】H3C 路由器多系列信息泄露漏洞

Nx01 产品简介 H3C路由器是一款高性能的路由器产品&#xff0c;具有稳定的性能和丰富的功能。它采用了先进的路由技术和安全机制&#xff0c;可以满足不同用户的需求&#xff0c;广泛应用于企业、运营商和数据中心等领域。 Nx02 漏洞描述 H3C路由器多系列存在信息泄露漏洞&…

林浩然与杨凌芸的Java奇遇记:Map世界的恋爱攻略

林浩然与杨凌芸的Java奇遇记&#xff1a;Map世界的恋爱攻略 The Java Adventure of Lin Haoran and Yang Lingyun: Love Strategy in the Map World 在一个充满代码香气的世界里&#xff0c;男主角林浩然&#xff0c;一个热衷于Java编程的程序员大侠&#xff0c;以其深厚的内功…

K8s进阶之路-核心概念/架构:

架构&#xff1a;Master/Node Master组件--主控节点{ 负责集群管理&#xff08;接收用户事件转化成任务分散到node节点上&#xff09;} Apiserver&#xff1a; 资源操作的唯一入口&#xff0c;提供认证、授权、API注册和发现等机制 Scheduler &#xff1a; 负责集群资源调度&am…

【CentOS】Linux 文件与目录管理

目录 1、目录的切换、新增和删除 &#xff08;1&#xff09;cd (change directory&#xff0c;切换目录) &#xff08;2&#xff09;pwd (显示目前所在的目录) &#xff08;3&#xff09;mkdir (make directory&#xff0c;建立新目录 ) &#xff08;4&#xff09;rmdir (…