声明:本文章学习自用,部分资料来自对罗伯特祥的汇总,感谢先人
目录
3.3Platinum Maestro运动控制器 —— 问题记录
1 编码要求:
- 代码不应该包含数字。常量应该在相关的头文件中定义,常量的值应该只在头文件中定义。包括像“0”和“1”这样的值。定义OK和NOT_OK(和/或类似地,如TRUE,FALSE)。
- 每个函数前面都应该有一些注释行,包括做什么、输入和输出参数、作者、版本
2.基于Platinum Maestro的运动控制系统的软件结构
2 整个运动控制系统主要分为三层:
- Host
在机器运行期间,主机(在本例中,主机可以是PC机、PLC或HMI)通常执行用户开发的应用程序。
这个应用程序执行顶层机器序列,也可以选择执行与轴向运动序列无关的其他任务,如用户界面、图像分析、条形码界面等,这可能是机器所需要的。
在主机为PC机的情况下,Elmo提供了GMAS函数块库,这是一个静态库,所有函数块都可以通过TCP/IP访问,这是Platinum Maestro的各种功能。用户将这个库与他的应用程序链接起来,因此可以使用库中包含的任何函数轻松地访问Platinum Maestro。
如果主机基于PLC或HDMI (Elmo不为这些设备提供任何库),用户应该使用TCP/IP支持的白金Maestro标准协议(目前Elmo支持TCP/IP上的MODBUS)。
在开发或维护阶段,主机(在本例中为PC计算机)运行由Elmo提供的特殊开发和维护/配置软件模块,以支持白金Maestro和驱动器的配置/设置/编程。
EASII - Elmo Application Studio软件是一个集多种功能于一体的环境,它支持与系统配置、设置、调优、运动和编程相关的所有任务。它用于整个系统(配置)、白金大师(设置、多轴运动)和终端单元(驱动器(配置、设置、调优向导、运动和编程)。
EASII使用与应用程序相同的静态库(GMAS函数块库),通过TCP/IP访问Platinum Maestro功能。
- Platinum Maestro
是一个网络多轴运动控制器,从主机(通过TCP/IP)获得高级运动或操作模式请求,并相应地管理实际机器的运动和序列,通过设备网络访问终端单元(驱动器、I/O控制器等),可以是can(使用can Open标准协议)或EtherCAT(使用CANopen over EtherCAT - CoE -标准协议)。是一个嵌入式计算机,运行LINUX操作系统和至少一个软件进程:内置的白金大师固件,由Elmo作为白金大师的一部分提供。开机后自动运行Platinum Maestro固件,完成以下任务:
- 与主机的TCP/IP通信
- 与在Platinum Maestro运行的可选用户应用程序进行进程到进程的通信
- 管理可能从主机(通过TCP/IP)和/或从用户应用程序(在Platinum Maestro本身运行)到达的所有函数块调用
- 多轴运动控制。这是铂金Maestro固件的核心,它负责执行所有的轨迹,控制,事件和同步算法,创建一个多轴运动控制器
- 设备网络(CAN或EtherCAT)的管理和与终端的通信
更多信息参见萝卜先人的文章:
Elmo运动控制器 —— Maestro Software结构和接口_罗伯特祥的博客-CSDN博客_elmo控制器
- 设备网络
终端单元(伺服驱动器、I/Os控制器、网络编码器等)连接到白金大师通过一个设备网络。白金大师支持两个设备网络之一:CAN或EtherCAT。Platinum Maestro固件负责管理设备网络,并根据该网络的标准,以同步方式执行所有必要的通信。一般来说,用户不需要知道设备网络的细节,因为所有的细节都是由Platinum Maestro自动处理的。
3.main() 程序结构
int main() {
// Initialize system, axes and all needed initializations
MainInit();
// Execute the state machine to handle the system sequences and control
MachineSequences();
// Close what needs to be closed before program termination
MainClose();
return 1; // Terminate the application program back to the Operating System
}
main()以对MainInit()的调用开始,MainInit()执行所有程序和系统的初始化(稍后将在手册示例中详细介绍)。在完成所有初始化之后,调用MachineSequences()函数。该函数有意地启动机器序列和运动的执行。在机器运行过程中,函数不会返回到main(),直到程序请求终止(由于错误,用户请求关闭,等等)。当机器操作完成时,machine Sequences()函数返回main(), main()调用MainClose()函数来关闭程序终止之前需要关闭的所有内容。这是程序的main()函数。尽可能简单和干净。
MachineSequences()函数:查找机器序列的实现,使用状态机结构。
请注意,红色的代码块是一段需要尽可能快地执行的代码,不应该包含任何执行时间或延迟相对较长的进程,它无条件地执行有限大小的代码,没有延迟或等待。
以下是相应的代码示例:
/*============================================================================
Function: MachineSequences()
Input arguments: None.
Output arguments: None.
Returned value: None.
Version: Version 1.00
Updated: 10/03/2011
Modifications: N/A
Description:
Starts the Main Timer function that will execute the states machines
to control the system. Also performs a slow background loop for
less time-critical background processes and monitoring of requests
to terminate the application.
============================================================================*/
void MachineSequences()
{
// Init all variables of the states machines
MachineSequencesInit();
// Enable MachineSequencesTimer() every TIMER_CYCLE ms
EnableMachineSequencesTimer(TIMER_CYCLE);
// Background loop. Handles termination request and other less time-critical background proceses
while (!giTerminate)
{
MachineSequencesTimer(0);
// Execute background process if required
BackgroundProcesses();
// Sleep for ~SLEEP_TIME micro-seconds to reduce CPU load
usleep(SLEEP_TIME);
}
// Termination requested. Close what needs to be cloased at the states machines
MachineSequencesClose();
return; // Back to the main() for program termination
}
3 杂项
3.1 实现简单的modbus数据读取
/*
============================================================================
Name : test_pmas.cpp
Author :
Version :
Description : GMAS C++ project source file
============================================================================
*/
#include "test_pmas.h"
#include <iostream>
#include "MMC_Definitions.h"
#include "mmcpplib.h"
#include <sys/socket.h>
using namespace std;
int CallbackFunc(unsigned char* recvBuffer, short recvBufferSize,void* lpsock){
}
int main()
{
cout << "Hello, world!" << endl;
CMMCConnection cConn ;
MMC_CONNECT_HNDL gConnHndl = cConn.ConnectIPCEx(0x7fffffff,(MMC_MB_CLBK)CallbackFunc) ;
CMMCHostComm cHost;
cHost.MbusStartServer(gConnHndl,1);
while(true){
MMC_MODBUSREADHOLDINGREGISTERSTABLE_OUT mbus_read_out;
cHost.MbusReadHoldingRegisterTable(0,9,mbus_read_out) ;
for(int i=0;i<9;i++){
cout<<"address ["<<i<<"] = "<<mbus_read_out.regArr[i]<<endl;
}
cout<<"==============================================="<<endl;
sleep(2);
}
return 0;
}
3.2 修改控制器IP
修改完注意保存,保存之后就是永久修改。
所以一定不要忘了修改后的IP,如果忘了只能通过USB去查看
3.3Platinum Maestro运动控制器 —— 问题记录
Platinum Maestro运动控制器 —— 问题记录_罗伯特祥的博客-CSDN博客