【嵌入式】Elmo—PMAS编程标准

 声明:本文章学习自用,部分资料来自对罗伯特祥的汇总,感谢先人

目录

1 编码要求:

2 整个运动控制系统主要分为三层:

3 杂项

 3.1 实现简单的modbus数据读取

3.2 修改控制器IP

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博客

 PMAS/GMAS使用笔记(个人笔记)_罗伯特祥的博客-CSDN博客

PMAS控制器中modbus通信 - 古月居 (guyuehome.com)

  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值