李飞江,李翔龙
(四川大学 制造科学与工程学院,成都 610065)
随着人们对工业生产中的自动化程度要求越来越高,运动控制器的发展得到了越来越广泛的重视。如今,国内外的运动控制器种类已是多种多样。虽然运动控制器的多样化给用户带来了一定的好处,方便用户在构建运动控制系统时,可以选择合适的控制器。然而长期以来,运动控制市场缺乏统一的编程标准[1],各个厂商的提供的控制器编程语言大多基于类Basic语言、C语言等高级编程语言,也有部分厂商采用G代码作为编程语言[2]。这些复杂的编程语言一方面限制了运动控制器的通用性,另一方面提高了对编程人员的要求,大多程序的开发只能由高水平的编程人员才能完成,严重影响了程序的开发效率。本系统以IEC61131-3标准定义的5种PLC编程语言中为基础[3-4],采用符合该标准的PLCopen功能块,成功实现了运动控制器的图形化编程,大大降低了程序的开发效率。即使在加工需求易变和专用运动控制行业中,用户只需要学习简单的PLC编程,便能对控制系统的程序进行自主开发。
文献[1]采用PLCopen功能块,提出一种图形化编程的运动控制系统,但该系统是基于beremiz开源开发平台实现的,导致其存在操作复杂,与window系统存在不兼容等问题。同时该文献最终只验证了单轴功能块的可行性,并没有对多轴功能块进行研究。本文使用德国KW-Software公司开发的符合IEC61131-3标准的MLUTIPROG软件作为控制系统开发平台,该软件使用方便[5-7],配合自行研发的“Assistnt”软件,成功实现PLCopen规范中的多轴功能块。最后利用该控制器完成了对贴标机的运动控制,证明了该控制器具有极大的市场应用空间,值得推广。
整个控制系统由人机界面交互层、应用指令层、运动控制层、设备驱动层4大部分组成,如图1所示。
图1 控制系统的整体构成
人机界面交互层包括MLUTIPROG软件和自主研发的Assistant软件,其中MLUTIPROG用来调用PLCopen标准运动功能块,Assistant则用来为控制器连接的电机设置轴号、轴组号等参数。二者相互配合才能实现多轴控制和多轴功能块的功能。应用指令层包含了所有PLCopen标准的单轴和多轴功能块,每个功能块根据功能的不同,有的用来实现电机的运动控制(MC_Home),有的用来设置和查询电机的状态(MC_ReadActualPosition)。运动控制层用来处理运动相关的参数,如:位移、速度加速度等。通过内部算法,实现电机的S型和T型升降速,防止电机速度出现大的波动和位置出现偏差,保证电机运动的精确性。同时运动控制层还根据所调用运动功能块的不同,自动切换电机工作于位移模式、速度模式或周期同步模式。设备驱动层用来接收从运动控制层传递下来的数据,然后将这些数据映射至不同的控制器硬件设备及现场总线设备中。4个部分协调工作,最终实现通过上层调用的图形化指令就能完成对电机的控制。
PLCopen规范功能块按其功能可分为管理型功能块和运动型功能块,管理型功能块主要用来检查轴的状态和设置轴的运动参数,运动型功能块主要是根据设置的速度、位置、加速度等实现轴的运动。按其操作轴的数量则可以分为单轴功能块和多轴功能块,单轴功能块只能控制一个轴,而多轴功能块能控制2~4轴。
所有功能块均由输入/输出变量、输入变量、输出变量、内部算法、功能块类型名5大部分组成[8-9],其模型如图2所示。每个变量的作用和数据类型都是确定的,其中输入/输出变量是一个用来保存轴参数的结构体。在单轴功能块中,它是一个名为AXIS_REF的结构体。系统在该结构体中定义了一个成员AxisNo(轴号),用来确定功能块的控制对象,它具有唯一性,且程序运行过程中不能被更改。一旦功能块的该参数被赋值,此功能块就只能控制具有相同轴号的电机。在多轴功能块中,它是一个名为AXIS_GROUP_REF的结构体,系统在该结构体中定义了轴组号(AxisGroupNo)、轴的数量(AxisNum)、各轴轴号(AxisNoArray)三个成员。通过这三个参数就能在调用多轴功能块时,确定被控电机的对象,顺利实现多轴功能块。内部算法和功能块的接口是两个独立的部分,不仅能为上层提供统一的编程接口,而且实现功能块的跨平台移植时,只需要更改不同硬件平台的操作硬件部分的代码,使移植变得简单。本控制器的内部算法是被封装起来的,用户不需知道其具体内容,只需操作功能块的输入接口便能实现相应的功能。
图2 PLCopen标准功能块模型
本系统使用嵌入在VS2012中的C#模板完成各功能块输入输出接口的定义,经过编译后会生成一个保存有功能块接口信息的FWL格式固件库文件和3个C++文件。其中一个C++文件是用来编写内部算法的重要文件,它是连接功能块外部接口和内部算法的桥梁。以MC_Power为例,在该C++文件中会生成void __PInvoke__MS_PLCopen_LIB::M C_Power::__Init()和void __PInvoke__MS_ PLCopen_LIB::MC_Power::__Process()两个函数。前者的函数内部是不能更改的,而后者的函数内部则用来编写功能块的内部算法,内部算法的编写以实现PLCopen标准所规定的功能块的功能为目的,其设计流程图如图3所示。3个C++文件在定制的ProConOS eCLR工程中被编译后,会生成一个exe文件,将该文件下载到控制器中。然后只要将FWL文件添加MLUTIPROG软件的固件库中,便完成了PLCopen功能块库的开发。开发完成的功能块不仅和PLCopen标准功能块的模型、功能完全一样。同时使用方便,只需将其拖动至MLUTIPGOG工程的编程界面,然后设置实例名、输入参数、输出参数,就能通过输入引脚Enable或Execute启动功能块。
图3 内部算法流程图
调用多轴功能块前,必须先通过Assistant软件为控制器上连接的被控对象电机的轴号参数赋值。将设置了轴号的电机添加到一个轴组中,并为该轴组的轴组号赋值,就能通过多轴功能块实现该轴组2~4轴直线或圆弧插补运动。编译MLUTIPROG工程后,“Assistant”软件会生成一个XML格式的文件,该文件保存了所有单轴和轴组参数的信息,将该文件和PLC工程一起下载到控制器便能完成这些参数的配置。
单轴功能块在对一个电机进行操作前,如果控制器只连接了一台电机,功能块则判断结构体AXIS_REF中的AxisNo和硬件设备上连接的电机轴号(该轴号如果不通过Assistant设置,则默认为0)是否相同,如果不相同,功能块则无法实现对该轴的控制并报错。当控制器上连接了多台电机时,系统会逐一判断轴号是否相同,找到轴号相同的电机后停止判断。如果找不到轴号相同的电机则会报错。当多轴功能块接收到启动命令时,将根据存储在AXIS_GROUP_REF中的参数AxisNum、AxisNoArray先找到连接在运动控制器上的被控电机。如果找不到相匹配的电机,功能块的输出引脚Error则会给出错误信号。当找到相匹配的电机后,功能块则会判断这些电机的轴组号和结构体AXIS_GROUP_REF中的AxisGroupNo是否相同,确认轴组号相同后才会启动该功能块,然后执行功能块的功能。因为MLUTIPROG软件中无法完成对电机相关参数的配置,所以仅仅依靠该软件无法实现多轴控制和多轴功能块的功能。自主研发的“Assistant”软件则弥补这一缺陷。通过该软件,不仅能为控制器上连接的电机轴号、轴组号赋值,还能为轴的部分运动参数赋值,例如,单位换算设置、操作设置、限位设置等,功能十分强大。
使用简单的梯形图编程方法,就能在MLUTIPROG中验证多轴功能块MC_MoveLinear_ Absolute。连接好硬件设备后,先在MLUTIPROG工程中编写好具体的PLC程序,然后在“Assistant”软件中配置好单轴和轴组相关参数。编译完成后,将其下载到控制器进行测试。启动功能块MC_MoveLinearAbsolute前,先设置它的输入变量,令目标位值Position=[100000,150000],目标速度Velcity=20000(该速度为两个轴的合速度),加速度Accelration =30000,减速带Decelaratiion=30000,加加速度Jerk=50000,因为其它参数的值对运动没有影响,所以设置为默认值(注意:本控制器中所有功能块中的运动参数的计量单位均为脉冲P)。完成参数设置后,便通过引脚Execute启动该功能块。在功能块的执行过程中采用MLUTIPROG软件中的逻辑分析器绘制两个轴的位移曲线(见图4)和合速度曲线(见图5)。由两图可知,两个轴在相同的时间内,根据设置的的目标位置和速度准确平稳的完成了运动,成功实现了该多轴功能块。
图4 两轴的位移曲线
图5 合速度曲线
贴标机的核心部分是将标签贴到传送带上的工件的贴标机构。标签输送轴是间歇性运动,当传感器检测到工件即将到达贴标位置,先启动延时,延时结束后轴开始转动。当移动距离达到标签的长度距离后便停止,等待下一次触发信号。为了保证标签整齐有效的贴在工件上,工件输送轴的速度和标签输送轴的速度必须相同,否则会出现标签错位和漏贴等现象。因为贴标签的过程中涉及2个轴的运动,属于多轴控制,先使用Assistant软件为两轴赋值,标签输送轴的轴号为1,工件输送轴的轴号为2。程序中使用一个定时器(TON_1)来触发标签输送轴运动,定时器的定时时间为传感器与贴标位置的距离(SensorDistance)除以轴的速度(Velocity)所得的值,这样就能保证工件到达贴标位置时标签轴刚好启动。工件输送轴的运动由PLCopen标准功能块MC_Velocity实现,而标签输送轴的运动由PLCopen标准功能块MC_MoveReltive实现,设置其输入引脚Distance的值为标签的长度(LableLength)。详细的PLC程序执行流程如图6所示。可见,采用本控制系统编写的PLC程序十分简单,只需调用几个功能块便能完成复杂的运动控制。即便是没有任何开发经验的人,学习简单的PLC编程后,就能进行独立的程序开发控制。
图6 PLC程序流程图
根据得到的MC_MoveLinearAbsolute功能块的两轴位移和合速度图,充分证明了在Assistant的配合下,电机运行平稳,成功实现了PLCopen标准功能块中的多轴功能块,展示了控制系统优越的性能。最后开发的贴标机控制程序,则证明了本控制系统图形化编程的优势,不仅编程简单,大大提高了程序的开发效率。同时多轴控制功能强大,只需对结构体AXIS_REF中的AxisNo赋予不同的值,便能同时控制多达32个轴。但本控制系统只在ZYNQ-Soc(2个A9内核+1个FPGA)+DDR3+EMMC为核心[10]构成的运动控制器上验证了其可行性,下一步将对本控制系统的跨平台移植进行研究。