PMAC上位机-中断通信(下位机通知上位机)
2018-02-05 16:28
337 查看
之前说过,上位机控制硬件都是通过发送指令进行的,这是单向的。那么反过来,下位机硬件给上位机发送指令怎么才能实现呢?对于PMAC来说,最常见的情况就是,当PMAC一次运动完成时通知当前PC程序运动已完成。
如下图所示,
PC给PMAC发送指令控制它做什么,当运动程序完成后中断通知上位机,在中断的同时发送一个标识P100表明完成的程序号,这个标明到底是1号轴运动完,还是是2号轴运动完。在PC端有一个中断回调函数,下位机发送中断后,会自动跳转到该函数中,中断函数接受中断,根据标识P100来决定不同的情况不同的处理。
通俗来说,就是如下流程:
[plain] view
plain copy
PC->PMAC:发送指令,告诉它做什么 (&1b40r)
PMAC:做完了,等待PC处理完前一个通知 (While (M613 = 1) wait)
PMAC->PC:某某事做完了,PC你就看着处理吧 (P100=1 M613=1)
PC:针对PMAC通知的事判断属于什么类型并处理 (根据P100判断)
PC->PMAC:处理完了,下位机可以发下一个通知消息了 (P100=0 M613=0)
如上图所示,M613这个是用硬件跳线配置的,指定当前中断响应通道,具体的设置在这里。P100是我们指定的上下位机通信变量,这个是自己定义的,也可以是P1/P2/P3等。
[plain] view
plain copy
&1
CLOSE ;确认所有缓冲区被关闭
OPEN PROG 40
CLEAR
TA(200)
TS(20)
F(30)
INC
Linear
X(10) Y(40)
dwell 0
;中断发送程序段
While (M613 = 1) wait ;等待上一次中断响应处理完成
P100=1 ;标明当前完成的程序,可为0、1、2等自定义的值
M613=1 ;向上位机发送中断
CLOSE
注册中断处理函数:
[cpp] view
plain copy
BOOL CInterruptDlg::ConnectPmac()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
if (NULL == PmacRuntimeLink(PMAC_NUM))
{
AfxMessageBox(TEXT("链接Pcomm32.dll函数库和打开PMAC卡连接失败!"));
return m_bIsConnect = FALSE;
}
//中断函数绑定
if( FALSE == PmacINTRFuncCallInit(PMAC_NUM, InterruptFunc2, 0, 0xFF1F))
{
AfxMessageBox(TEXT("PMAC函数中断初始化失败"));
return m_bIsConnect = FALSE;
}
return m_bIsConnect = TRUE;
}
对应的中断函数处理如下:
[cpp] view
plain copy
//中断处理
void WINAPI InterruptFunc2(DWORD msg, PINTRBUFFER pBuffer)
{
extern CInterruptApp theApp;
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
if (pBuffer->dwInterruptType == ISR_IR6)
{
if (1 == PmacGetVariable(PMAC_NUM, 'P', 100, 0))
{
AfxMessageBox(TEXT("处理完成!"));
//重置中断
lstrcpy(szCmd, "M613=0 P100=0");
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
}
}
}
演示程序源代码下载地址,在该程序中点击电机开始回零后,回零按钮灰度化。直到下位机完成回零发送中断给上位机程序,上位机程序判断后处理使能按钮。这个程序是最简单的中断处理程序,主要是为了阐明原理,再复杂的程序都和这个原理一样的,基于这个原理我们可以开发更复杂的上下位机交互程序。
注意这里不能用默认安装完成后的runtime.h,原本的我试过有问题,必须用我放在程序源文件夹里的重写myRuntime.h。
更多PMAC代码参见我的网站,基本上都是这个系列涉及到的知识点。
到此为止,PMAC的使用系列基本上写完了,看完这一个系列,基本的PMAC编程和调试应该没有问题了,剩下的就是Read The Fuck Manual了。
原创,转载请注明来自http://blog.csdn.net/wenzhou1219
1.下位机通知上位机原理
如下图所示,PC给PMAC发送指令控制它做什么,当运动程序完成后中断通知上位机,在中断的同时发送一个标识P100表明完成的程序号,这个标明到底是1号轴运动完,还是是2号轴运动完。在PC端有一个中断回调函数,下位机发送中断后,会自动跳转到该函数中,中断函数接受中断,根据标识P100来决定不同的情况不同的处理。
通俗来说,就是如下流程:
[plain] view
plain copy
PC->PMAC:发送指令,告诉它做什么 (&1b40r)
PMAC:做完了,等待PC处理完前一个通知 (While (M613 = 1) wait)
PMAC->PC:某某事做完了,PC你就看着处理吧 (P100=1 M613=1)
PC:针对PMAC通知的事判断属于什么类型并处理 (根据P100判断)
PC->PMAC:处理完了,下位机可以发下一个通知消息了 (P100=0 M613=0)
如上图所示,M613这个是用硬件跳线配置的,指定当前中断响应通道,具体的设置在这里。P100是我们指定的上下位机通信变量,这个是自己定义的,也可以是P1/P2/P3等。
2.下位机代码
[plain] viewplain copy
&1
CLOSE ;确认所有缓冲区被关闭
OPEN PROG 40
CLEAR
TA(200)
TS(20)
F(30)
INC
Linear
X(10) Y(40)
dwell 0
;中断发送程序段
While (M613 = 1) wait ;等待上一次中断响应处理完成
P100=1 ;标明当前完成的程序,可为0、1、2等自定义的值
M613=1 ;向上位机发送中断
CLOSE
3.上位机处理代码
注册中断处理函数:[cpp] view
plain copy
BOOL CInterruptDlg::ConnectPmac()
{
//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
if (NULL == PmacRuntimeLink(PMAC_NUM))
{
AfxMessageBox(TEXT("链接Pcomm32.dll函数库和打开PMAC卡连接失败!"));
return m_bIsConnect = FALSE;
}
//中断函数绑定
if( FALSE == PmacINTRFuncCallInit(PMAC_NUM, InterruptFunc2, 0, 0xFF1F))
{
AfxMessageBox(TEXT("PMAC函数中断初始化失败"));
return m_bIsConnect = FALSE;
}
return m_bIsConnect = TRUE;
}
对应的中断函数处理如下:
[cpp] view
plain copy
//中断处理
void WINAPI InterruptFunc2(DWORD msg, PINTRBUFFER pBuffer)
{
extern CInterruptApp theApp;
TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];
if (pBuffer->dwInterruptType == ISR_IR6)
{
if (1 == PmacGetVariable(PMAC_NUM, 'P', 100, 0))
{
AfxMessageBox(TEXT("处理完成!"));
//重置中断
lstrcpy(szCmd, "M613=0 P100=0");
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
}
}
}
演示程序源代码下载地址,在该程序中点击电机开始回零后,回零按钮灰度化。直到下位机完成回零发送中断给上位机程序,上位机程序判断后处理使能按钮。这个程序是最简单的中断处理程序,主要是为了阐明原理,再复杂的程序都和这个原理一样的,基于这个原理我们可以开发更复杂的上下位机交互程序。
注意这里不能用默认安装完成后的runtime.h,原本的我试过有问题,必须用我放在程序源文件夹里的重写myRuntime.h。
更多PMAC代码参见我的网站,基本上都是这个系列涉及到的知识点。
到此为止,PMAC的使用系列基本上写完了,看完这一个系列,基本的PMAC编程和调试应该没有问题了,剩下的就是Read The Fuck Manual了。
原创,转载请注明来自http://blog.csdn.net/wenzhou1219
相关文章推荐
- 12.PMAC上位机-中断通信(下位机通知上位机)
- 12.PMAC上位机-中断通信(下位机通知上位机)
- 12.PMAC上位机-中断通信(下位机通知上位机)
- 智能车上位机与下位机通信的例子
- stm32的usb与上位机通过中断传输进行通信控制led--LibUsbDotNet
- 用VB编写的上位机与嵌入式LINUX下位机的网络通信(TCP)
- .PMAC上位机和下位机交互-设置参数(如修改速度和PID参数)
- 倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码
- RT-Thread 学习笔记(二)---线程创建及任务间通信之中断锁
- ros与下位机通信常用的c++ boost串口应用
- 下位机单片机c语言发送数据到串口,上位机pc机java语言获取端口数据
- 上位机 串口 通信 协议
- socket通信之六:Overlapped I/O 事件通知模型实现的客户/服务器模型
- Java线程通信与协作的解决方案——等待/通知机制
- [原]Java多线程编程学习笔记之十:线程间通信中notify通知的遗漏(含代码)
- 上位机与单片机的通信问题
- 【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题(含代码)
- Arduino 与上位机的通信
- 国内自助机市场用安卓板做上位机电机驱动板做下位机研发自助机大概步骤
- Linux内核中断引入用户空间(异步通知机制)