松下A6伺服驱动器MADLN15SE与欧姆龙PLC的连接和试运行

本文详细介绍了如何使用欧姆龙CP1H-X40DT-D PLC与松下A6伺服驱动器MADLN15SE进行连接和试运行。内容包括接线步骤、参数设置以及PLC编程,旨在提供一个实用的伺服电机控制方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       今年是2019年,松下A6伺服驱动器及电机已经全面铺货,完全替代市场上的A5型号。除了更换接口一样,无忧升级,性能更是在原来的基础上提高了20%以上。在很多行业,大家已经基本上默认了松下电机在此行业中应用的效果与优势,纷纷采用其电控执行部件。在此我想以我们常用的简单应用方案一步一步将CP1H-X40DT-D与MADLN15SE进行连机试运行。作为一个实用例子,这个试运行方案完全可以经过一定的完善后来移植到大型项目上。

     一、简介:

     A6系列家庭大分类:

       这里我们选用应用最普遍的经济款A6SE系列。其具有基本功能位置控制模式,可以通过带有脉冲输出功能的PLC去发脉冲驱动电机旋转。PLC我们就选用前面章节讲过的CP1H-X40DT-D,其具有4轴100K脉冲输出,可同时控制4个伺服电机运行。

       二、接线

       以下图示显示了A5伺服与OMRON专用脉冲输出模块CJ1W-NC113的连接:

其实A6的接线端口X4与此方法完全一样,CP1H的脉冲输出口100.00/100.01完全替代掉CJ1W-NC113模块CW/CCW输出口A6/A8后,即是我们想要的接线方案,下面我们重新制作简单直观点的接线图:

         输出点位对应:511--》103.01 , 510--》103.00, 300--》100.00, 301--》100.01  

        输入点位对应:219--》1.07, 217--》1.05 ,218--》1.06

        另外:伺服电机的机械原始位传感器OUT端我们接到PLC的输入点0.02上。

        其余口按上图分别供上24V和0V。接线图完成,下面我们给伺服上电,对伺服驱动器进行参数设置。

        三、设置

          一般我们常需要设置的参数是Pr0.03,Pr0.08 。Pr0.03是伺服的刚性参数,其初始数值是13,调动范围是13-30,将其调大后,伺服的跟随性和定位速度会大大提高,一般我们设置为19,过大的数值会引起电机啸叫。Pr0.08是电子齿轮比,接收到PLC发送的10000个脉冲伺服电机转一圈,其默认值为10000. 假如我有一个使用工况需要伺服电机转100圈,那么就需要PLC发送1000000个脉冲,PLC发送脉冲和伺服执行都需要很长时间。此时我们将Pr0.08修改为100,那么PLC只需要发送10000个脉冲即可。但不可设置过小,不然定位会有很大的累计误差。

        注意三点:一是修改完参数要进行保存到内存的操作;二是若修改了Pr0.08,保存后还需要进行驱动器重新上电重启;三是如果不小心改错了参数而又不知道是哪一个项,将驱动进行恢复出厂设置即可。

        四、PLC编程

        以下编程分为3个小部分,每个部分对于一个完整的控制程序都是必不可少的。当然还有其它部分的控制程序,比如碰撞报警程序、自动复位程序、手动调试程序等等,这里不一一赘述。

        4.1 伺服搜索原始位部分

其中W10.10是一个内部辅助继电器,0.02是当前伺服的原始位传感器对应与PLC上的点位。

        4.2 PLC发脉冲指令PLS2的启动频率、目标频率、加减速频率、还有脉冲当量等

具体参见PLS2指令详细介绍。这些参数保存在PLC的连续几个相邻内存D里,我的D100~D106 , D110~D116 , D190~D196内存值设置参考如下:

        4.3 CW/CCW正转反转运行程序部分

        CW/CCW都是默认的伺服电机旋转方向,如果其方向与所设计的方向相反,可有两种方法交换方向。一是交换100.00、100.01两个接线端子;二是修改伺服电机参数Pr0.00(第三项【设置】里可设定)。

W401.05/W401.06是正反转用内部辅助继电器,你可以换成相应的输入按钮。D100~D106,D110~D116的数值可参照【4.2】中的值。将PLC程序下载到CP1H-X40DT-D中,再灌入内存D的数值,使W401.05或W401.06得电和失电即可试运行。

以下是一个简单的示例代码,用于在 EtherCAT 上控制松下 MADLN15BE 伺服驱动器。 ```c #include <stdio.h> #include "ethercat.h" #define MADLN15BE_SLAVE_ID 0x0001 #define MADLN15BE_CONTROLWORD_OFFSET 0x6040 #define MADLN15BE_STATUSWORD_OFFSET 0x6041 #define MADLN15BE_MODES_OF_OPERATION_OFFSET 0x6060 #define MADLN15BE_TARGET_POSITION_OFFSET 0x607A #define MADLN15BE_PROFILE_VELOCITY_OFFSET 0x6081 #define MADLN15BE_PROFILE_ACCELERATION_OFFSET 0x6083 int main() { int slave_count; int slaves_online; int madln15be_index; int32_t target_position; uint16_t controlword; uint16_t statusword; uint16_t modes_of_operation; uint32_t profile_velocity; uint32_t profile_acceleration; printf("Initializing EtherCAT master...\n"); ec_init("eth0"); printf("Detecting slaves...\n"); slave_count = ec_slavecount(); printf("Found %d slaves.\n", slave_count); printf("Requesting OP state for all slaves...\n"); ec_statecheck(0, EC_STATE_INIT, EC_TIMEOUTSTATE); printf("Checking slave states...\n"); slaves_online = ec_slave[0].outputs[0]; printf("%d/%d slaves are online.\n", slaves_online, slave_count); printf("Searching for MADLN15BE slave...\n"); for (int i = 1; i <= slave_count; i++) { if (ec_slave[i].eep_man == 0x00000C && ec_slave[i].eep_id == 0x00C200) { madln15be_index = i; printf("MADLN15BE found at index %d.\n", madln15be_index); break; } } if (madln15be_index == 0) { printf("MADLN15BE not found.\n"); return 1; } printf("Setting MADLN15BE to OP state...\n"); ec_slave[madln15be_index].state = EC_STATE_OPERATIONAL; ec_writestate(madln15be_index); printf("Waiting for MADLN15BE to reach OP state...\n"); ec_statecheck(madln15be_index, EC_STATE_OPERATIONAL, EC_TIMEOUTSTATE); printf("Setting MADLN15BE to cyclic synchronous position mode...\n"); modes_of_operation = 8; ec_SDOwrite(madln15be_index, MADLN15BE_MODES_OF_OPERATION_OFFSET, 0, 16, &modes_of_operation, EC_TIMEOUTSAFE); printf("Setting MADLN15BE target position...\n"); target_position = 100000; ec_SDOwrite(madln15be_index, MADLN15BE_TARGET_POSITION_OFFSET, 0, 32, &target_position, EC_TIMEOUTSAFE); printf("Setting MADLN15BE profile velocity...\n"); profile_velocity = 10000; ec_SDOwrite(madln15be_index, MADLN15BE_PROFILE_VELOCITY_OFFSET, 0, 32, &profile_velocity, EC_TIMEOUTSAFE); printf("Setting MADLN15BE profile acceleration...\n"); profile_acceleration = 1000000; ec_SDOwrite(madln15be_index, MADLN15BE_PROFILE_ACCELERATION_OFFSET, 0, 32, &profile_acceleration, EC_TIMEOUTSAFE); printf("Starting MADLN15BE motion...\n"); controlword = 0x000F; ec_SDOwrite(madln15be_index, MADLN15BE_CONTROLWORD_OFFSET, 0, 16, &controlword, EC_TIMEOUTSAFE); while (1) { ec_readstate(); statusword = ec_slave[madln15be_index].inputs[0]; if (statusword & 0x400) { printf("MADLN15BE reached target position.\n"); break; } } printf("Stopping MADLN15BE motion...\n"); controlword = 0x010F; ec_SDOwrite(madln15be_index, MADLN15BE_CONTROLWORD_OFFSET, 0, 16, &controlword, EC_TIMEOUTSAFE); printf("Setting MADLN15BE to pre-op state...\n"); ec_slave[madln15be_index].state = EC_STATE_PRE_OP; ec_writestate(madln15be_index); printf("Shutting down EtherCAT master...\n"); ec_close(); return 0; } ``` 注意:这只是一个示例代码,实际的应用程序需要根据具体的硬件应用场景进行修改优化。此外,使用 EtherCAT 伺服驱动器需要一定的专业知识技能,需要谨慎使用并确保安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值