首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
收藏本文     查看收藏
多线程编程一直是让鄙人不愿提起的伤心往事。

需要太多的耐心,和足够的编程基本功及对操作系统的了解。在运动控制编程中,有许多骨灰级编程高手,常对此故作深沉,一般会这样回答:
呵呵,多线程编程,好哇,不错…”
要是你再问他自己用不用多线程编程方法去作运动控制软件,他会这样说:
是啊,不过,好像用不着吧!

若有幸得到他的耐心指导,则省下许多为多线程付出的痛苦。我何尝不曾经历

当然,多线程又不是绝症,当然有解决方法。故在您真的想动手之前听听下面的经验之谈,或许有参考作用。

每一个进程都含有一个主线程,若再开辟一个线程作某些事情,则至少为两个或两个以上的线程在作业。
下面引用名家言-----Gevorg Ter-Saakov(呵呵,是老外,我不认识的)

在多线程环境中存在一个潜在问题:就是创建多线程应用程序时,有一个意外的优化问题,会导致你的程序有不可预期的行为。
如果你定义了一些可以被两个或两个以上线程访问的变量,则必须使用关键字volatile。否则,如果一个线程更改了变量,第二个线程不能注意到该变化,因为变量被优化,编译器可能使用一个CPU寄存器。
一般情况下,在调式模式下不会发生问题,在发行模式下,就可能导致行为不可预期。

根据以上的思想,回过头来看看控制卡的编程。
一般控制卡的操作都含有一套动态库,动态库内部定义的变量对于多线程的访问就存在上述问题,而绝大部分动态库在发布版中,都不会加上volatile关键字。以下面的形式为例:

void GoToPoistion( long nPulse )//
指定移动绝对位置
{
d3000_start_t_move( XCH, nPulse-d3000_get_command_pos(0), speed );
}

d3000_start_t_move
DMC3000控制卡的相对移动函数
d3000_get_command_pos
DMC3000控制卡读取指令位置函数。

当脉冲距离发出时,客户往往需要动态的以图形方式显示当前位置,或者直接用文字显示出来,若此实现在另一个多线程内是这样的:
char string[0x100];
sprintf( string, “Xposition=%ld”, d3000_get_command_pos(0)) ;

GetDlgItem( IDC_STATIC_MSG )->SetWindowText( string );//
显示到屏幕上

由此可见,d3000_get_command_pos在两个线程当中都被调用,它内部则会访问同一变量。故,在一定速度频率下,或某一特定环境下,读取出来的脉冲计数不可预期,显示出来的图形或坐标位置也将出错。

故,本人在《DMC3000控制卡的多任务编程》,对位置的读取采用较为谨慎的态度。

多线程编程的同步问题也较为复杂,一时难以言尽,大凡以高手的见地,最好以简单的方式作稳定的事情,有兴趣的朋友不妨阅读一下DoEvents的实现还来得有效率一些。
 

状 态: 离线

公司简介
产品目录

公司名称: 深圳市雷赛智能控制股份有限公司
联 系 人: 梁邦敏
电  话: 755-26401178
传  真:
地  址: 深圳市南山区登良路天安南油工业区2栋3楼
邮  编: 518000
主  页:
 
该厂商相关技术文摘:
CNC解释库调用接口详述
DMC1000控制卡不能响应系统消息
DMC2000脉冲速度初始化故障
DMC2000运动控制卡常见软件问题的解决方案
DMC2200驱动程序特殊安装方法
DMC3000控制卡,与CNC之G代码的邦定关系
DMC3000控制卡的多任务编程
多类型运动控制卡编程方法探讨
发现步进电机定位不准怎么办
过程控制编程之简要探讨
控制卡应用编程技巧几招(2)
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved