9.PMAC上位机-上位机发送指令

通常我们说PC控制其他硬件工作,指的是PC给相应的硬件发送指令来控制对应硬件。同时在发送完指令后可能会接受到相对应的反馈消息,告诉PC当前硬件的状态和参数等数据,这就是常见的PC和硬件通信。PMAC已经帮我们封装好了这通信过程,直接调用相关函数即可,这里讲通过上位机给PMAC发送指令控制电机运动或设置参数或返回当前指定参数值等。

PMAC提供PmacGetResponse和PmacGetResponseEX给PMAC发送指令。这一过程非常类似在Terminal中我们手动给PMAC发送指令,这里两个函数支持发送的命令也是在Terminal中输入的在线指令(Online Command)。

先看几个最简单示例额,在对话框上分别添加几个按钮和其响应函数,在响应函数中添加代码实现如下功能:

1.设置参数

<pre name="code" class="cpp"><pre name="code" class="cpp">//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();

//打开PMAC卡连接
OpenPmacDevice(0);

TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];

/*****************************************************/
lstrcpy(szCmd, "p1=1");

//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/

//关闭PMAC卡连接
ClosePmacDevice(0);

//FreeLibrary
CloseRuntimeLink();


2.获取参数值

//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();

//打开PMAC卡连接
OpenPmacDevice(0);

TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];

/*****************************************************/
lstrcpy(szCmd, "p1");

//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/

//显示当前参数值
AfxMessageBox(szRes);

//关闭PMAC卡连接
ClosePmacDevice(0);

//FreeLibrary
CloseRuntimeLink();

3.控制电机点动

//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();

//打开PMAC卡连接
OpenPmacDevice(0);

TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];

/*****************************************************/
lstrcpy(szCmd, "#6j+");

//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/

//关闭PMAC卡连接
ClosePmacDevice(0);

//FreeLibrary
CloseRuntimeLink();

4.控制程序运行

//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
OpenRuntimeLink();

//打开PMAC卡连接
OpenPmacDevice(0);

TCHAR szRes[MAX_PATH];
TCHAR szCmd[MAX_PATH];

/*****************************************************/
lstrcpy(szCmd, "&1b20r");

//发送指令和接受往回发的指令填充到szRes
PmacGetResponse(0,szRes,MAX_PATH,szCmd);
/*****************************************************/

//关闭PMAC卡连接
ClosePmacDevice(0);

//FreeLibrary
CloseRuntimeLink();

注意这里的轴号和程序号和自己编写并下载的程序一致。

看到了吗,在/**/注释间的是不是很熟悉,其实就是我们在PEWin32中Terminal窗口发送的指令,在/**/之前和之后其实就是建立和释放操作环境的过程。很多时候,对于上位机程序来说,我们甚至只需要调用PmacGetResponse和PmacGetResponseEX就足以满足我们的需求了。

5.演示程序

总体演示,下面我们把上面的常用功能集成到如下界面中:

对应的操作代码和上述演示代码一样,这里为了演示方便每次发送指令前都要建立环境和连接PMAC、发送指令、断开连接和释放环境,在实际项目中,只需要再程序实例化或窗口实例化时建立环境和连接PMAC,在窗口关闭或程序退出时断开连接和释放环境即可。代码如下:

//发送指令
void CTest1Dlg::OnSend()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	OpenRuntimeLink();

	//打开PMAC卡连接
	OpenPmacDevice(0);

	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];

	//获得输入的待发送指令字符串
	GetDlgItemText(IDE_COMMAND, szCmd, MAX_PATH);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	//关闭PMAC卡连接
	ClosePmacDevice(0);

	//FreeLibrary
	CloseRuntimeLink();
}

//正方向移动
void CTest1Dlg::OnMovePos()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	OpenRuntimeLink();

	//打开PMAC卡连接
	OpenPmacDevice(0);

	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];

	lstrcpy(szCmd, "#6j+");

	//显示输入的待发送指令字符串
	SetDlgItemText(IDE_COMMAND, szCmd);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	//关闭PMAC卡连接
	ClosePmacDevice(0);

	//FreeLibrary
	CloseRuntimeLink();
}

//负方向移动
void CTest1Dlg::OnMoveNeg()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	OpenRuntimeLink();

	//打开PMAC卡连接
	OpenPmacDevice(0);

	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];

	lstrcpy(szCmd, "#6j-");

	//显示输入的待发送指令字符串
	SetDlgItemText(IDE_COMMAND, szCmd);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	//关闭PMAC卡连接
	ClosePmacDevice(0);

	//FreeLibrary
	CloseRuntimeLink();
}

//停止
void CTest1Dlg::OnStopMove()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	OpenRuntimeLink();

	//打开PMAC卡连接
	OpenPmacDevice(0);

	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];

	lstrcpy(szCmd, "#6k");

	//显示输入的待发送指令字符串
	SetDlgItemText(IDE_COMMAND, szCmd);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	//关闭PMAC卡连接
	ClosePmacDevice(0);

	//FreeLibrary
	CloseRuntimeLink();
}

//回零
void CTest1Dlg::OnHome()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	OpenRuntimeLink();

	//打开PMAC卡连接
	OpenPmacDevice(0);

	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];

	/************************************************************************/
	/*激活电机                                                              */
	/************************************************************************/
	lstrcpy(szCmd, "#6j/#8j/");

	//显示输入的待发送指令字符串
	SetDlgItemText(IDE_COMMAND, szCmd);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	Sleep(1000);

	/************************************************************************/
	/* 调用回零程序,注意这里自己的回零程序号                                */
	/************************************************************************/
	lstrcpy(szCmd, "&1b20r");

	//显示输入的待发送指令字符串
	SetDlgItemText(IDE_COMMAND, szCmd);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	//关闭PMAC卡连接
	ClosePmacDevice(0);

	//FreeLibrary
	CloseRuntimeLink();
}

//运行程序
void CTest1Dlg::OnRunProg()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	OpenRuntimeLink();

	//打开PMAC卡连接
	OpenPmacDevice(0);

	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];

	lstrcpy(szCmd, "&1b40r");

	//显示输入的待发送指令字符串
	SetDlgItemText(IDE_COMMAND, szCmd);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	//关闭PMAC卡连接
	ClosePmacDevice(0);

	//FreeLibrary
	CloseRuntimeLink();
}

//停止程序
void CTest1Dlg::OnStopProg()
{
	//链接Pcomm32.dll函数库,注意引入myRuntimeLink头文件
	OpenRuntimeLink();

	//打开PMAC卡连接
	OpenPmacDevice(0);

	TCHAR szRes[MAX_PATH];
	TCHAR szCmd[MAX_PATH];

	lstrcpy(szCmd, "&1b40a");

	//显示输入的待发送指令字符串
	SetDlgItemText(IDE_COMMAND, szCmd);

	//发送指令和接受往回发的指令填充到szRes
	PmacGetResponse(0,szRes,MAX_PATH,szCmd);

	//显示接受指令
	SetDlgItemText(IDE_RECEIVE, szRes);

	//关闭PMAC卡连接
	ClosePmacDevice(0);

	//FreeLibrary
	CloseRuntimeLink();
}

程序演示代码下载链接

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

时间: 2024-07-31 17:06:03

9.PMAC上位机-上位机发送指令的相关文章

unity3D和串口之间的通信,接收下位机数据和发送指令

using UnityEngine;using System.Collections;using System.IO.Ports;using System;using System.Collections.Generic;using System.Threading; public class PortControl : MonoBehaviour { public GUIText gui; public string portName = "COM2"; public int bau

局域网控制系统-上位机-PC机

C#程序代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.IO.Ports; 10 //using System

运维堡垒机(跳板机)系统 python

相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有 身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了上述功能. AD:2014WOT全球软件技术峰会北京站 课程视频发布 11月21日-22日 与WOT技术大会相约深圳 现在抢票 相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有 身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了

Xshell同时向多个会话发送指令的方法

我们平时使用XSHELL.SecureCRT.putty等ssh连接工具连接到远程主机,每次输入指令都是在单一会话窗口,如果有很多台会话,需要同时输入同样的指令,我们就不用一一输入,浪费时间和精力.可以发掘更方便的方法,下面就介绍一下Xshell同时向多个会话发送指令的设置方法. 使用版本为:Xshell 4.0   具体步骤如下: 1.打开2个会话 2.选择菜单栏:查看――撰写栏,勾选前面的方框选中. 3.勾选后,在Xshell窗口的最下方,出现对话框,在此输入命令,可以选择到当前的会话,也可

openstack宿主机宕机迁移

控制器上修改数据库 mysql -Dnova -e "update instances set host='os-node11' where uuid='5209f21b-b81e-4e19-8193-57263dc93dd7'" 创建一个网桥 brctl addbr  qbrdf45a648-6e 初始化迁移后的XML文件及启动云主机 cd/var/lib/nova/instances/5209f21b-b81e-4e19-8193-57263dc93dd7 删除libvirt.xm

apple iphone 3gs 有锁机 刷机 越狱 解锁 全教程(报错3194,3014,1600等问题可参考)

以自身经历列步骤如下:(基本思路就是刷6.1.6,越狱,降级基带,解锁) 一.准备工作 1.下载3gs 6.1.6官方固件.地址:http://act.feng.com/wetools/index.php?r=iosRom/index PS:为什么要使用6.1.6,是因为苹果已经关闭了6.1.2.6.1.3等shsh验证(有shsh备份也无效),因此只要是更新这种固件,毫无疑问会出现3XXX问题,改host,打开tss服务器也是没有用的. 2.下载3gs 6.0官方固件.地址同上.注意是选6.0

【Android开发—智能家居系列】(四):UDP通信发送指令

思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指令,让WIFI模块接入指定路由 [5]手机连接路由 [6]发送指令,获得WIFI模块的动态IP地址 UDP通信线程类 package com.jczb.smartlife.common; import java.io.IOException; import java.net.DatagramPack

docker下jumpserver跳板机 /堡垒机详细部署

关于跳板机/堡垒机的介绍: 跳板机可以使开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作 跳板机使用场景: jumpserver概述 Jumpserver是一款开源的开源的堡垒机,可使系统的管理员和开发人员安全的连接到企业内部服务器上执行操作,并且支持大部分操作系统,是一款非常安全的远程连接工具 常见支持的系统: CentOS, RedHat, Fedora, Amazon LinuxDebianSUSE, UbuntuFreeBSD其他ssh协议硬件设备

linux Jumpserver跳板机 /堡垒机详细部署

关于跳板机/堡垒机的介绍: 跳板机的定义: 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作: 跳板机缺点: 没有实现对运维人员操作行为的控制和审计,使用跳板机的过程中还是会出现误操作.远规操作导致的事故,一旦出现操作事故很难快速定位到原因和责任人: 堡垒机的定义 堡垒机,即在一个特定的网络环境下,为了保障网络和数据丌受来自外部和内部用户的***和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态.安全事件.网络