运动控制卡网络通讯的心跳检测之C#上位机编程
本文导读
今天,正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。
01 ECI2618B硬件介绍
ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴,可扩展至12轴的运动控制,用以实现直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴以及机械手指令等简单的轨迹控制需求;采用优化的网络通讯协议可以实现实时的运动控制。

ECI2618B控制卡功能特点:
(1)本身支持6差分脉冲轴+4单端脉冲轴运动控制,最多可扩展至12轴运动控制。
(2)脉冲输出模式:脉冲/方向或双脉冲。
(3)AXIS接口支持编码器位置测量,可以配置为手轮输入模式。
(4)专用的手轮输入接口。
(5)每轴最大输出脉冲频率10MHz。
(6)通过CAN总线,最多可扩展到256个隔离输入口和256个隔离输出口。
(7)轴正负限位信号口/原点信号口可以随意配置到任何输入口。
(8)通用数字输出口最大输出电流可达500mA,可直接驱动部分电磁阀。
(9)支持点位运动、电子凸轮、直线插补、圆弧插补、连续插补运动、机械手指令。
(10)支持Basic多文件多任务编程。
(11)多种程序加密手段,保护客户的知识产权。

ECI2000系列经济型多轴运动控制卡可用于电子半导体设备(检测类设备、组装类设备、锁附类设备、焊锡机)、点胶设备和流水线等12轴以内脉冲应用场合。
控制器支持windows、linux、Mac、Android、wince各种操作系统下的开发,提供vc、c#、vb.net、labview等各种环境的dll库,如下图。上位机软件编程参考《ZMotion PC函数库编程手册》。

02 为什么要进行心跳检测,作用是什么
1.实时监测:
通过检测上位机与下位机的通信状态,可以实时监测上位机是否正常连接和通讯。一旦发现上位机掉线,系统可以及时采取相应的应对措施,避免因为掉线导致通讯中断或数据丢失。
2.系统稳定性:
上位机是控制系统的核心部分,掉线可能会导致整个系统失去控制。掉线检测可以保障系统的稳定性,及时发现掉线情况并进行处理,保持系统正常运行。
3.数据完整性:
上位机通常负责与用户界面交互、数据处理和决策,数据的完整性对系统运行至关重要。通过掉线检测,系统可以及时发现掉线情况,保证数据的完整性和准确性。
4.故障诊断:
掉线检测可以作为系统故障诊断的一种手段,通过监测上位机的状态,可以帮助确定系统出现问题的具体原因,加快故障排查和修复的速度。
03 BASIC语言进行心跳检测脚本语言编写
(一)前情提要
心跳检测的实现主要是两个部分组成:
1.上位机周期修改变量;
2.控制器程序周期检测变量并在掉线的时候执行一些急停操作。
在示例中,上位机程序会周期修改Heart_Status,控制器程序会周期扫描Heart_Status,并在检测到变量的值异常的时候打开输出口,模拟掉线急停的操作。
流程图如下所示:

(二)创建变量
'**************************心跳相关变量定义************************
Global Heart_StarFlag '开始通讯标识变量
Global Heart_Status '通讯标识变量
Global Heart_Time '心跳超时时间
Global Heart_OutNum '急停OP数量
Global OutList_Address '急停OUTmodbus_long起始地址(Ps:3系列以下,自定义变量为24位浮点数,32位精度丢失,用modbus_long来代替)
GLOBAL CONST cVer=CONTROL
Heart_StarFlag =-1
Heart_Status = 0
Heart_OutNum = 10
OutList_Address =0
dim i,j
(三)开启扫描
扫描流程:
1.等待上位机发送扫描开始指令;
2.根据控制器信号进入不同扫描程序(原理一样只是实现略有不同);
3.将通讯标识变量置1;
4.等待一个超时时间;
5.判断通讯标识;
6.如果为1表示上位机没有进行通讯,掉线状态。进行掉线保护操作;
7.为0表示进行通讯,正常状态。开启下一次扫描。
WHILE TRUEWAIT until Heart_StarFlag = 1 '等待PC软件连接DELAY Heart_Time 'PC连接之后,延时一个超时时间,避免上位WHILE TRUEif Heart_Status = 0 then Heart_Status = 1 '等待PC上修改通讯变量ticks = Heart_Time '超时判断处理,等待PC上修改Heart_Flag = 0WAIT until ticks < 0 or Heart_Status=0if Heart_Status = 1 THENRAPIDSTOP(2)WAIT IDLEOP(0,31,MODBUS_LONG(OutList_Address)) 'MODBUS_LONG存储32位整型按位控制掉线急停IOHeart_StarFlag=-1Heart_Status = 0 ELSEOP(0,31,0)EndifWEND
WEND
end
04 C#语言进行心跳检测开发
(一)新建WinForm项目并添加函数库
1.在VS2010菜单“文件”→“新建”→“项目”,启动创建项目向导。

2.选择开发语言为“Visual C#”和.NET Framework 4以及Windows窗体应用程序。

3.找到厂家提供的光盘资料里面的C#函数库,路径如下(32位库为例)。
(1)进入厂商提供的光盘资料找到“04PC函数”文件夹,并点击进入。

(2)选择“01PC函数库V2.1”文件夹。

(3)选择“windows平台”文件夹。

(4)根据需要选择对应的函数库,这里选择32位库。

(5)解压C#压缩包,里面有C#对应的函数库。

(6)函数库具体路径如下。

4.将厂商提供的C#的库文件以及相关文件复制到新建的项目中。
(1)将Zmcaux.cs文件复制到新建的项目里面中。

(2)将zauxdll.dll和zmotion.dll文件放入bin\debug文件夹中。

5.用vs打开新建的项目文件,在右边的解决方案资源管理器中点击“显示所有文件”,然后鼠标右击Zmcaux.cs文件,点击“包括在项目中”。


6.双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,并声明控制器句柄g_handle。

(二)PC函数介绍
1.PC函数手册可在光盘资料查看,具体路径如下。

2.链接控制器,获取链接句柄。

3.下载并运行控制器程序。

4.设置控制器程序参数。


05 C#例程建设之网络通讯的心跳检测
(一)前情提要
上位机软件的主要功能:
1.下载并运行控制器程序;
2.设置扫描参数;
3.开启和关闭心跳检测;
4.设置急停IO。
界面如下图所示:

(二)例程讲解
1.连接控制器获取句柄,上位机操作通过获取到的句柄来操作控制器。
//连接控制器,控制器默认IP是192.168.0.11
ZauxErr = zmcaux.ZAux_OpenEth("192.168.0.11", out g_Handle);
if (0 != ZauxErr)
{AlmInifFile.Write(DateTime.Now.ToString("F"), "ZAux_OpenEth执行错误,错误码:" + ZauxErr.ToString(), "错误码信息");
}
2.下载心跳bas程序
函数介绍:
通过OpenFileDialog获取控制器程序路径,然后通过openFile判断文件是否为空,最后通过ZAux_BasDown将控制器程序下载到控制器。
private void btnFile_Click(object sender, EventArgs e)
{string m_strOpenFileName;FileStream openFile;OpenFileDialog fileOpen = new OpenFileDialog();fileOpen.Filter = "Basic Files (*.bas)|*.bas|All Files (*.*)|*.*";fileOpen.RestoreDirectory = true;fileOpen.FilterIndex = 1;if (fileOpen.ShowDialog() == DialogResult.OK){m_strOpenFileName = fileOpen.FileName;try{openFile = new FileStream(fileOpen.FileName, FileMode.Open, FileAccess.Read);openFile.Close();}catch (Exception ex){MessageBox.Show("Open Failed!");return;}ret = zmcaux.ZAux_BasDown(g_handle, m_strOpenFileName, 0);controlReturnQue.Enqueue(ret);if (ret == 0)MessageBox.Show("心跳程序已成功加载");}
}


3.启动心跳检测
函数介绍:
首先通过SetTimeOutPara设置扫描参数,然后ZAux_Direct_SetUserVar设置Heart_StarFlag心跳标示变量。启动控制器扫描程序,随后开启上位机扫描程序。
private void btnStart_Click(object sender, EventArgs e)
{SetTimeOutPara();ret = zmcaux.ZAux_Direct_SetUserVar(g_handle, "Heart_StarFlag", 1);controlReturnQue.Enqueue(ret);timeOut = 0;timer1.Enabled = true;timer1.Interval = int.Parse(tbxUpTimer.Text);tbState.Text = "已启动";
}
//上位机扫描程序
private void timer1_Tick(object sender, EventArgs e)
{ret = zmcaux.ZAux_Direct_SetUserVar(g_handle, "Heart_Status", 0);controlReturnQue.Enqueue(ret);if (ret != 0)timeOut++;if (timeOut > 1){tbState.Text = "未启动";timer1.Stop();}
}


4.RTSys的使用
(1)打开【RTSys】软件,点击【连接】输入控制器的IP(默认IP:192.168.0.11)。


(2)打开输出口界面,即可通过输出口观察是否掉线。

(三)教学视频
教学视频可点击→“教学视频:运动控制卡网络通讯的心跳检测之C#上位机编程”查看。
本次,正运动技术运动控制卡网络通讯的心跳检测之C#上位机编程,就分享到这里。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
相关文章:
运动控制卡网络通讯的心跳检测之C#上位机编程
本文导读 今天,正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。 01 ECI2618B硬件介绍 ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴,可扩展至12轴的运动控制…...
QT 控件定义为智能指针引发的bug
问题描述: std::unique_ptr<QStackedLayout> m_stacked_layout; 如上为定义; 调用: Line13ABClient::Line13ABClient(QWidget *parent) : BaseWidget(parent) { // 成员变量初始化 m_get_ready false; m_tittle_wnd…...
Scala项目(图书管理系统)
3、service BookService package org.app package serviceimport org.app.dao.{BookDAO, BorrowRecordDAO} import org.app.models.{BookModel, BorrowRecordModel}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookS…...
前端开发 详解 Node. js 都有哪些全局对象?
在 Node.js 中,全局对象(Global Objects)是指在任何模块中都可以直接访问的对象和变量,而不需要显式地进行导入。Node.js 提供了一些全局对象,帮助开发者在编写应用程序时更加方便地进行一些常见操作,如文件…...
2024_12_20_生活记录
年底了,提前祝各位朋友们新年快乐!我将近两年没动笔写blog了,主要确实挺忙。。。今天想简单聊聊自己的近期想法,一方面是职业规划,一方面是生信,最后是个人感悟。 职业规划 熟悉我的朋友们会了解我之前一直…...
Sequelize ORM 现有表如何使用
一、 在mysql中创建一个表 或者随便找一个现有的表 已经有了一张叫做xw_posts的表。表里的字段非常简单,大家可以自己建一下 CREATE TABLE xw_posts (id int unsigned NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_…...
ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关
目录 应用 1:它是相关性还是托布勒第一定律? 应用 2:将空间带入非空间模型 结论 在 ArcGIS Pro 3.4 中,我们在新的空间组件实用程序(Moran 特征向量)工具集中发布了一个新工具 - 从字段过滤空间自相关。…...
H3C MPLS跨域optionB
实验拓扑 实验需求 如图,VPN1 和 VPN2 分别通过运营商 MPLS VPN 连接各自分支机构按照图示配置 IP 地址,VPN1 和 VPN2 连接同一个 PE 设备的私网 IP 网段存在地址复用,使用多 VRF 技术来防止 IP 冲突AS 100 和 AS 200 内部的公共网络中各自运行 OSPF 使 AS 内各设备的 Loo…...
源码分析之Openlayers中Geometry基类介绍
概述 在上一篇文章源码分析之Openlayers中Geom篇中提到Geometry类是继承于 Openlayers 中的BaseObject类(参考源码分析之Openlayers中核心BaseObject类).而Geometry类通常情况下也是作为一个抽象基类,作为Geom几何图形的基类或父类,不会在应用中去实例化它.Geometry类回去注册…...
《Vue3 三》Vue 中的 options 选项
data 选项: data 选项:属性值必须是一个函数;返回值是一个对象,返回的对象会被 Vue 的响应式系统劫持,之后对该对象的任何访问或者修改都会在劫持中被处理。 在 Vue2.x 中,data 的属性值可以是一个函数&am…...
Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南
一、前言 在国内数字化转型浪潮和 信创 大背景下,“替代进口”成为许多企业级应用所需要面对的重要课题,搜索领域也不例外。 Elasticsearch(简称 ES)作为一款业界领先的全文搜索和分析引擎,虽然功能强大,但…...
Pytorch | 从零构建EfficientNet对CIFAR10进行分类
Pytorch | 从零构建EfficientNet对CIFAR10进行分类 CIFAR10数据集EfficientNet设计理念网络结构性能特点应用领域发展和改进 EfficientNet结构代码详解结构代码代码详解MBConv 类初始化方法前向传播 forward 方法 EfficientNet 类初始化方法前向传播 forward 方法 训练过程和测…...
Python超能力:高级技巧让你的代码飞起来
文章一览 前言一、with1.1 基本用法1.2 示例自定义上下文管理器 二、条件表达式三、列表式推导式与 zip 结合 四、map() 函数(内置函数)map用于数据清洗1. 数据清洗:字母大小写规范2. filter() 函数 五、匿名函数 lambda5.1 lambda的参数&…...
熊军出席ACDU·中国行南京站,详解SQL管理之道
12月21日,2024 ACDU中国行在南京圆满收官,本次活动分为三个篇章——回顾历史、立足当下、展望未来,为线上线下与会观众呈现了一场跨越时空的技术盛宴,吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…...
FPGA实现MIPI转FPD-Link车载同轴视频传输方案,基于IMX327+FPD953架构,提供工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频串化-解串方案MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 5、…...
vue3动态绑定图片和使用阿里巴巴矢量图
矢量图 1。加购物车 2. 下载在本地 解压 (把以下文件放进项目文件夹里面) ├── font ├── iconfont.css ├── iconfont.json (font-class用法) ├── iconfont.js (symbol用法) ├─…...
‘vite‘ 不是内部或外部命令,也不是可运行的程序
报错:执行 npm run dev时,提示’vite’ 不是内部或外部命令,也不是可运行的程序 解决:执行 npm install -g vite 报错:导入vite后再次执行npm run dev,报错failed to load config from E:\eclipseWP\test1…...
2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
引言 本期介绍了一种基于加权平均位置概念的元启发式优化算法,称为加权平均优化算法Weighted average algorithm,WAA。该成果于2024年12月最新发表在中JCR1区、 中科院1区 SCI期刊 Knowledge-Based Systems。 在WAA算法中,加权平均位置代表当…...
如何获取 ABAP 内表中的重复项
要识别 ABAP 内表中的重复项,可以结合使用排序和循环。下面的示例展示了如何查找内部表中的重复条目: DATA: BEGIN OF itab OCCURS 0,field1 TYPE i,field2 TYPE c LENGTH 10,END OF itab,wa LIKE LINE OF itab.* Add sample data to internal table it…...
编译笔记:vs 中 正在从以下位置***加载符号 C# 中捕获C/C++抛出的异常
加载符号 解决方法: 进入VS—工具—选项----调试----符号,看右边有个“Microsoft符号服务器”,将前面的勾去掉,(可能还有删除下面的那个缓存)。 参考 C# 中捕获C/C抛出的异常 在需要捕捉破坏性异常的函数…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
