控制系统软件设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
控制系统软件设计
在本论文中,我们采用pro-motion软件作为多轴工业CT运动控制系统的控制软件,相对于运动控制卡的方式,很展现出很大的提升,比如在系统的同步控制、多轴运动控制和程序的执行性方面。
1.1 软件简介
1.1.1 连接控制器
在安装结束软件后,运行软件,会弹出“接口”的对话框,我们需要对其进行设置,如下图:
图1.1 pro-motion设置界面
1.1.2 配置的设置
在配置电机轴之前,我们首要选择配置的轴。可以在窗口中直接选择要配置的轴,被选中的轴将以蓝色背景标识,如下图:
3
图1.2 选中配置轴
图1.3 pro-motion输入波形选择
如上图,根据向导可一步步设置,比如交流和直流、有刷与无刷等,最终成为我们所需求的电机。
1.2 pro-motion软件工作环境
整个运动控制系统可以简单的使用软件来操作,在pro-motion软件中,我们可以看到控制系统的组成,如下图:
图1.4 控制系统原理图
我们可以看出,整个系统是一个反馈回路,系统会对反馈结果进行计算与修正,这使得我们能更加精确地、快速的控制工业CT平台,达到更好的要求。
1.2.1 编程语言
因为C语言具有简洁方便等特点,我们使用C语言程序对该系统进行编写,使得其控制整个运动平台,其中包括平台初始化部分、接口部分、执行程序部分等。
对于工业CT控制系统的软件设计必须要实现运动控制的功能,此外,还有大量的变量处理和参数计算,因此需要所编写程序的全面,来实现命令的发送和接收,以及状态的反馈、扫描参数的计算等功能。以下是为该系统所编写的一套C语言程序:
//********************************************************
// PMDRPperiph.cpp
// PMD Prodigy/CME Resource Protocol wrapper class implementation
//********************************************************
//#include "stdafx.h"
#include
#include "PMDRPperiph.h"
//********************************************************
// generic RP protocol wrapper class
PMDRPperiph::PMDRPperiph(PMDPeriphHandle* hPeriph)
{
m_hPeriph = hPeriph;
}
void PMDRPperiph::WriteByte(char byte)
{
PMDPeriphSend(m_hPeriph, &byte, 1, TIMEOUT);
}
void PMDRPperiph::ReadByte(char* byte)
{
PMDErrorCode result;
PMDparam nReceived;
result = PMDPeriphReceive(m_hPeriph, byte, &nReceived, 1, TIMEOUT);
if (PMD_ERR_OK != result)
throw result;
}
int PMDRPperiph::SendPacket(char* pbuff, int nCount)
{
if (PMD_ERR_OK != PMDPeriphSend(m_hPeriph, pbuff, nCount, TIMEOUT))
return 0;
return nCount;
}
int PMDRPperiph::ReceivePacket(char* pbuff, int nMaxCount, int timeout)
{
PMDparam nReceived = 0;
PMDErrorCode result;
result = PMDPeriphReceive(m_hPeriph, pbuff, &nReceived, nMaxCount, timeout);
if (PMD_ERR_OK != result)
throw result;
return nReceived;
}
//********************************************************
// COM port protocol is slightly different
PMDRPperiphCOM::PMDRPperiphCOM(PMDPeriphHandle* hPeriph) : PMDRPperiph(hPeriph)
{
m_Address = 0;
}
void PMDRPperiphCOM::SetAddress(int address)
{
m_Address = address;
}
int PMDRPperiphCOM::SendPacket(char* pbuff, int nCount)
{
char address = (char)m_hPeriph->address;
char checksum = 0;
char packetlength = nCount;
for (int i=0; i { checksum += pbuff[i]; } if (address > 0) WriteByte(address); WriteByte(checksum); WriteByte(packetlength);