在工业自动化领域,汇川技术的AC801、AM400和AM600系列PLC凭借其卓越的实时性和稳定性,已成为众多自动化项目的首选控制器。这些控制器搭载Codesys开发平台后,能够实现复杂的运动控制逻辑,特别是通过EtherCAT总线协议同时驱动多台伺服电机的场景。
我最近完成的一个典型项目案例,就是使用AC801控制器通过EtherCAT总线同时控制20台伺服电机,并配合威纶通HMI实现人机交互界面。这套系统已经稳定运行超过2000小时,期间经历了完整的生产验证周期。最值得称道的是其模块化架构设计,使得程序复用率高达70%以上,新项目导入时通常只需调整30%左右的参数配置即可投入使用。
在这个项目中,我们选用了汇川AC801-0205-E型号PLC作为主站控制器,其具备:
伺服系统采用IS620N系列伺服驱动器,其主要参数:
网络拓扑采用线性连接方式:
code复制AC801 PLC → 伺服1 → 伺服2 → ... → 伺服20 → 终端电阻
这种结构布线简单,但需要注意:
网络总长度不超过100米,超过时需要增加中继器
每个节点间的距离建议控制在3米以内
在Codesys 3.5 SP16开发环境中,硬件配置步骤如下:
xml复制<DeviceInfo>
<Name>Servo01</Name>
<Type>IS620N</Type>
<Vendor>Inovance</Vendor>
<Address>0x00000001</Address>
</DeviceInfo>
配置完成后,可以通过在线视图查看网络状态:
每个伺服驱动器在EtherCAT网络中通过对象字典(Object Dictionary)进行参数访问。我们建立了统一的对象字典管理模块:
st复制FUNCTION_BLOCK FB_ObjectDictionary
VAR_INPUT
nSlaveIndex : UINT; // 从站索引(1-20)
END_VAR
VAR_OUTPUT
stParams : ST_ServoParams; // 参数结构体
END_VAR
VAR
aParamCache : ARRAY[1..20] OF ST_ServoParams;
END_VAR
参数结构体包含关键控制参数:
st复制TYPE ST_ServoParams :
STRUCT
fTargetPos : LREAL; // 目标位置(mm)
fActualPos : LREAL; // 实际位置(mm)
fVelocity : LREAL; // 运行速度(mm/s)
nStatus : WORD; // 状态字
nControl : WORD; // 控制字
fTorque : LREAL; // 扭矩反馈(%)
END_STRUCT
END_TYPE
对于20个轴的同步控制,我们采用"虚拟主轴+电子齿轮"的方案:
st复制PROGRAM VirtualMaster
VAR
fMasterPos : LREAL; // 虚拟主轴位置
fMasterVel : LREAL; // 虚拟主轴速度
END_VAR
st复制// 轴1跟随虚拟主轴
Axis1.Config.GearRatio.Numerator := 1;
Axis1.Config.GearRatio.Denominator := 1;
Axis1.Config.GearMaster := VirtualMaster.fMasterPos;
st复制// 在伺服使能前执行
FOR i := 1 TO 20 DO
Axis[i].MC_SetPosition(fMasterPos);
Axis[i].MC_Sync();
END_FOR
威纶通MT8071iE触摸屏通过Ethernet/IP协议与PLC通信,关键配置参数:
在EasyBuilder Pro软件中建立设备连接时,需要注意:
勾选"启用快速通信"选项
设置合理的通信超时(建议3000ms)
启用数据压缩功能减少带宽占用
典型界面元素的数据绑定示例:
xml复制<Button Address="%MW100" OnText="启动" OffText="停止">
<Action Type="Write" Address="%MX0.0" Value="1"/>
</Button>
xml复制<NumDisplay Format="0.000" Address="%MD500">
<Scale Factor="0.001" Offset="0"/>
</NumDisplay>
xml复制<TrendChart SampleTime="100">
<Pen Address="%MD510" Color="Red" Width="2"/>
<Pen Address="%MD520" Color="Blue" Width="2"/>
</TrendChart>
当遇到通信异常时,可按以下步骤排查:
bash复制ping 192.168.1.1 -t # 测试基础连通性
st复制// 在PLC程序中读取状态
ecMaster.GetSlaveInfo(1, stSlaveInfo);
IF stSlaveInfo.nErrorCnt > 0 THEN
// 记录错误计数器
nErrorLog[nLogIndex] := stSlaveInfo.nErrorCnt;
nLogIndex := nLogIndex + 1;
END_IF
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 从站无响应 | 终端电阻未启用 | 检查末端从站的跳线设置 |
| 周期性通信中断 | 网络负载过高 | 延长通信周期或优化PDO映射 |
| 位置偏差大 | 时钟不同步 | 启用DC同步并检查线缆质量 |
通过以下参数调整可提升系统响应:
st复制// 速度环参数
Axis1.Config.VelocityLoop.Kp := 0.35;
Axis1.Config.VelocityLoop.Ki := 0.02;
Axis1.Config.VelocityLoop.Kd := 0.01;
// 位置环参数
Axis1.Config.PositionLoop.Kp := 45.0;
Axis1.Config.PositionLoop.Ki := 0.5;
st复制// 低通滤波器截止频率
Axis1.Config.Filter.LPFreq := 100.0; // Hz
Axis1.Config.Filter.NotchFreq := 0.0; // 禁用陷波
我们的程序架构采用分层设计:
code复制├── ApplicationLayer (工艺逻辑)
├── MotionLayer (运动控制)
├── IOLayer (IO管理)
└── Communication (通信协议)
每个层通过明确定义的接口交互:
plantuml复制@startuml
component ApplicationLayer {
[工艺程序]
}
component MotionLayer {
[轴控制]
}
component IOLayer {
[IO映射]
}
ApplicationLayer --> MotionLayer : 调用运动指令
MotionLayer --> IOLayer : 读取传感器状态
@enduml
当需要将本方案应用到新项目时:
st复制// 在ConfigManager中修改机器参数
Config.SetValue('Machine.StrokeLength', 1200.0);
Config.SetValue('Axis.MaxVelocity', 500.0);
这套系统在实际应用中表现出极高的稳定性,在汽车焊装生产线上的定位精度达到±0.1mm,节拍时间控制在8秒以内。通过模块化设计,新项目开发周期从原来的3周缩短到5天左右