VC++多线程编程

ABB机器人如何与视觉建立通讯 阅读详情
 

一、创建一个线程     

  HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    SIZE_T dwStackSize,
    LPTHREAD_START_ROUTINE lpStartAddress,
    LPVOID lpParameter,
    DWORD dwCreationFlags,
    LPDWORD lpThreadId
  );
   参数1:指向SECURITY_ATTRIBUTES结构体的指针。这里可以设置为NULL,使用缺省的安全性。
   参数2:指定初始提交的栈的大小,以字节为单位。系统会将这个值四舍五入为最近的页面。
         (页面:是系统管理内存时使用的内存单位,不同的CPU其页面大小也是不同的。X86
           使用的页面大小是4KB。当保留地址空间的一个区域时,系统要确保该区域的大小是
           系统的页面大小的倍数)
         如果该值是0或者小于缺省提交大小,则使用和调用线程一样的大小。
   参数3:指向LPTHREAD_START_ROUTINE(应用程序定义的函数类型)的指针。这个函数将被线程
         执行,表示了线程的起始地址。看线程入口函数ThreadProc。
   参数4:指定传递给线程的单独的参数的值。
   参数5:指定控制线程创建的附加标记。如果CREATE_SUSPENDED标记被指定,线程创建后处于暂停
         状态不会运行,直到调用了ResumeThread函数。
         如果该值是0,线程在创建之后立即运行。
   参数6:[out]指向一个变量用来接收线程的标识符。创建一个线程时,系统会为线程分配一个ID号。
         Windows NT/2000:如果这个参数是NULL,线程的标识符不会返回。
         Windows 95/98  :这个参数不能是NULL  
   如果函数执行成功,返回新线程的句柄。
二、编写线程函数
   可参考ThreadProc:    
   DWORD WINAPI ThreadProc(
    LPVOID lpParameter
   );
   
   类型和参数要匹配,函数名任意。
三、关闭线程句柄
   BOOL CloseHandle(
    HANDLE hObject
   );
   
   注意:关闭句柄并没有终止新创建的线程。只是表示对新创建的线程的引用不敢兴趣,系统会递减新
        线程的线程内核对象的使用计数。当使用计数为0的时候,系统就会释放线程内核对象。如果
        在主线程中没有关闭线程的句柄,始终都会保留一个引用。这样线程内核对象的引用计数就不会
        为0。即使新线程执行完毕,线程内核对象也不会被释放,只有等到进程终止的时候系统才会为
        残留的对象做清理工作。所以应该在不再使用线程的句柄的时候将其关闭掉,让线程的线程内核
        对象的引用计数减1。
四、暂停线程的执行
   
   当线程暂停执行的时候,也就是表示它放弃了执行的权力。操作系统会从等待运行的线程队列中选择
   一个线程来运行。新创建的线程就可以得到运行的机会。
   
   可以使用函数Sleep:
   
   void Sleep(
     DWORD dwMilliseconds //sleep time 以毫秒为单位
   );
   暂停当前线程指定时间间隔的执行。
五、中止线程的运行
(1)	线程函数返回(最好使用这种方法)。
这是确保所有线程资源被正确地清除的唯一办法。
如果线程能够返回,就可以确保下列事项的实现:
•在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。
•操作系统将正确地释放线程堆栈使用的内存。
•系统将线程的退出代码设置为线程函数的返回值。
•系统将递减线程内核对象的使用计数。
(2)	调用ExitThread函数(最好不要使用这种方法)。
该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类
对象)将不被撤消。
(3)	调用TerminateThread函数(应该避免使用这种方法)。
TerminateThread能撤消任何线程。线程的内核对象的使用计数也被递减。TerminateThread函数是异步
运行的函数。如果要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或者类似的函数。
当使用返回或调用ExitThread的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用TerminateThread,
那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。
(4)	包含线程的进程终止运行(应该避免使用这种方法)。
由于整个进程已经被关闭,进程使用的所有资源肯定已被清除。就像从每个剩余的线程调用TerminateThread
一样。这意味着正确的应用程序清除没有发生,即C++对象撤消函数没有被调用,数据没有转至磁盘等等。
一旦线程不再运行,系统中就没有别的线程能够处理该线程的句柄。然而别的线程可以调用GetExitcodeThread
来检查由hThread标识的线程是否已经终止运行。如果它已经终止运行,则确定它的退出代码。

避坑指南:ABB机器人欧拉角转换时,为什么你的RZ轴总对不上?四元数转换的3个常见误区 本文深入解析ABB机器人欧拉角与四元数转换中的常见问题,特别是RZ轴对不齐的难题。通过对比欧拉角和四元数的特性,揭示坐标系假设错误、旋转顺序忽视和单位混淆三大误区,并提供ABB特有的转换逻辑和分步解决方案,帮助工程师实现精准的姿态参数转换。 阅读详情

相关推荐

ABB机器人姿态数据:欧拉角与四元数旋转详解

工业机器人姿态控制是自动化领域的核心技术,其中欧拉角和四元数是两种关键的数学表示方法。欧拉角通过三个旋转角度直观描述空间方位,但存在万向节死锁问题;四元数则用四元组表示旋转,避免了奇异点且计算高效。在ABB机器人系统中,这两种方法配合旋转矩阵,广泛应用于码垛、焊接等场景的姿态控制。理解其转换原理和优化技巧,对实现高精度运动控制至关重要,特别是在处理视觉引导、连续路径规划等复杂任务时。本文以ABB RAPID语言为例,详解姿态数据的核心算法和工程实践。

weixin_30607125的博客 238

VC++创建一个线程thread

VC++创建一个新线程

ABB机器人通讯实战:手把手教你搞定四元数与欧拉角的相互转换(附RAPID代码)

本文详细介绍了ABB机器人通讯中四元数与欧拉角的相互转换方法,包括RAPID代码实现和实际应用技巧。通过对比两种姿态表示方法的差异,提供从配置环境到数据验证的完整解决方案,帮助工程师高效处理工业机器人姿态数据转换问题。

weixin_30872499的博客 488

vc入门宝典六(多线程)

多线程   何志丹主要内容:1,  工作者线程2,  用户界面线程3,  同步线程被分为工作者线程和用户用户界面线程。用户界面的线程的特点是拥有单独的消息队列,可以具有自己的窗口界面,能够对用户输入和事件作出反应。 可以用以下方法建立一个工作者线程。UINT MyThreadProc(LPVOID pParam){…}AfxBeginThre

闻缺陷则喜何志丹 8420

VC++ CreateThread() 创建线程函数

//函数原型HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize,  LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, D

卡邦的博客 5758

VC++多线程全面讲解

使用 Spy++ 工具查看系统中当前的进程与线程! 1、创建新线程的三种方式: 方式一:CreateThread(记得关闭线程句柄) 使用情况:无MFC时使用。 方式二:AfxBeginThread(会自动释放的,不用你去释放) 使用情况:MFC中有界面的程序中可以用;可以使用工作线程和界面现场。 方式三:_beginthreadex(记得关闭线程句柄) 与操作系统相关的系统中使用 ①、我们的程序到底是不是多线程运行的?有什么优点呢? 加个 Sleep(1000*10) 便知分晓,即对于一些比较耗时的操作,

qq_43123271的博客 3918

VC线程Thread和事件Event

VC线程Thread和事件Event操作方法: 头文件 class CMyTestService { public: CMyTestService(); virtual ~CMyTestService(); public: DWORD m_dwThreadID;//监听线程ID BOOL m_bThreadRun;//监听线程内,控制线程是否结束 HANDLE m_

冰点蓝欣的专栏 4397

ABB机器人发送实时位置数据

对于不同的主控系统,机器人发送当前位置数据的方式也多种多样。如果使用PC机作为上位机来读取机器人实时位置信息,那么我们就可以通过使用IRC5 OPC Server来读取机器人位置数据,然后再发送给PC上位机;当然,也可以通过PC SDK对机器人控制器进行二次开发,然后通过PC Interface选项,直接读取控制器中机器人的位置信息。如果是使用PLC作为上位机来读取机器人实时位置信息,那么我们就可以通过工业现场通信,如ProfiBus、ProfiNet、DeviceNet等,然后使用ABB机器人内置的数据处

疯狂的石头 1万+

ABB机器人重定位移动的欧拉角与Rapid指令实战解析

本文深入解析ABB机器人重定位移动的核心原理与Rapid指令实战应用,重点探讨欧拉角(OrientZYX)在姿态调整中的关键作用。通过焊接、抛光等工业场景案例,详细讲解EulerZYX和OrientZYX指令的使用技巧,并提供常见问题排查指南与运动平滑性优化方案,帮助工程师高效实现精确的机器人姿态控制。

weixin_26805597的博客 210

KUKA与ABB机器人姿态表示实战:3种欧拉角顺序与四元数转换代码实现

本文深入解析KUKA与ABB机器人的姿态表示差异,重点介绍KUKA采用的Z-Y-X欧拉角与ABB四元数之间的转换原理与Python实现。通过详细的代码示例和对比分析,帮助工程师解决多品牌机器人协同作业中的姿态转换难题,提升工业机器人编程效率。

weixin_30879833的博客 489

ABB机器人操作技巧:如何像摇杆一样灵活控制重定位移动?

本文深入解析了ABB机器人重定位移动的操作原理与编程实现。通过拆解示教器摇杆控制背后的欧拉角逻辑,详细介绍了如何利用RAPID指令(如OrientZYX)将直观的“摇杆手感”转化为精确、可编程的运动控制,从而在焊接、装配等精细作业中实现灵活的姿态调整。

win55的博客 801

基恩士3D视觉用于ABB机器人的KeyenceRobotVisionSetup.sys系统模块程序解析(八、KeyCurPos,KeyRelMove)

摘要:本文详细解析了基恩士3D视觉系统与ABB机器人交互的两个核心程序。KeyCurPos程序用于获取机器人当前位置数据(包括XYZ坐标、姿态和关节配置),通过CRobT()函数实现位置采集,并发送给视觉系统。KeyRelMove程序则根据视觉指令执行相对运动,支持笛卡尔和工具两种移动模式,利用RelTool函数计算目标位置,包含完善的错误处理机制。两个程序共同构成了视觉引导机器人精确定位的关键技术框架,实现了机器人位置的实时获取与动态调整功能。

OBNAIT的博客 1201

基恩士3D视觉用于ABB机器人的KeyenceRobotVisionSetup.sys系统模块程序解析(十四、UtilGetRsltPosStr,UtilGetParamStr)

摘要:KeyenceRobotVisionSetup.sys是基恩士3D视觉系统与ABB机器人交互的系统模块,包含两个核心程序:1) UtilGetRsltPosStr将机器人位置数据(米)转换为毫米单位字符串,包含坐标(XYZ)和姿态(RxRyRz),并计算校验和;2) UtilGetParamStr获取机器人当前工具/工件坐标系参数、运动速度(限制1-100%)和加速度(固定100%),构建标准化参数字符串。两个程序均包含错误处理机制,通过校验和确保数据传输可靠性,实现机器人系统与视觉设备间的标准化通讯

OBNAIT的博客 1084

焊缝跟踪 abb机器人二次开发 上位机由C#+halcon联合编程 提供源码讲解

该上位机系统成功实现了视觉引导—特征识别—位姿解算—轨迹规划—机器人控制采用亚像素级激光中心线提取,提升定位精度;创新性地通过向量法解析 V 型焊缝角度,实现焊枪姿态自动纠偏;设计动态拟合+转弯半径的实时跟踪算法,兼顾精度与平滑性;模块化架构便于功能扩展与维护。未来可进一步优化方向包括:引入深度学习提升复杂焊缝识别鲁棒性、集成真实焊接过程中的弧光抑制算法、以及研究热变形补偿模型,使系统更贴近工业现场应用需求。

Q27699885的博客 1976

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

Robot_PLC_HMI_Automation 4877

从欧拉角到四元数:ABB机器人姿态表示全解析(含坐标系转换技巧)

本文深入解析了ABB机器人姿态表示的核心方法,重点对比了欧拉角与四元数在直观性、计算效率和奇异性方面的差异。文章详细阐述了四元数在ABB机器人内部控制与平滑路径规划中的关键作用,并提供了实用的坐标系转换技巧与RAPID代码示例,帮助开发者规避万向节死锁等常见问题,实现精准、稳定的姿态控制。

wood5的博客 514

基恩士3D视觉用于ABB机器人的KeyenceRobotVisionSetup.sys系统模块程序解析(十五、UtilGetToolDataStr)

本文介绍了基恩士3D视觉系统与ABB机器人交互的关键程序UtilGetToolDataStr。该程序将工具坐标系数据转换为格式化字符串,包含TCP的X/Y/Z偏移量(毫米)和Rx/Ry/Rz旋转值(0.001度单位),并计算校验和。程序使用高精度转换系数(COEF_LENGTH=1000.0将米转为毫米,COEF_ANGLE_HP=1000.0将度转为0.001度),能处理成功/错误状态,为视觉系统提供精确的工具位姿信息,确保准确的抓取操作。

OBNAIT的博客 715

机器人Socket通信及实战应用

任务需求 现有工业视觉相机,通过利用Socket通信使相机和机器人相连接,任意旋转待检测物体后,相机拍照即可识别出物体的位置,视觉相机检测物体的位置通过Socket发送给机器人端,机器人根据发送过来的数据完成对被检测到物体的上表面轮廓“边缘”运动,工作站布局如图1- 1所示。 图1- 1工作站布局 软件工具 Socket调试工具:TCP客户端-小陆课堂 ABB机器人仿真软件:RobotStudio6.08 知识准备 本任务利用

luhaibini的博客 8790
上一篇: 七种VC延时方式
下一篇: dos命令大全
hmill
博客等级 码龄21年 16粉丝 8原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值