前期资料:C#通过SOEM+Leal.Core.Net.EtherCAT开发EtherCAT主站 - 阅山
博主代码:
ethercatdemo\ethercatdemo\Program.cs:
// See https://aka.ms/new-console-template for more information
using ethercatdemo;
Console.WriteLine("Hello, World!");
EtherCAT ethercat = new EtherCAT();
ethercat.Start("以太网 3");
ethercatdemo\ethercatdemo\EtherCAT.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Core.Net.EtherCAT;
namespace ethercatdemo
{
internal class EtherCAT
{
public void printPosition(EtherCATSlave_CiA402 _axis,int seconds) {
for (int i = 0; i < seconds; i++) {
int PositionActualValue = _axis.PositionActualValue;
//Console.WriteLine($"PositionActualValue: {PositionActualValue}");
Console.WriteLine($"从站名:{_axis.SlaveName} 从站地址:{_axis.SlaveAddr} 从站状态:{_axis.SlaveState} 报警代码:{_axis.ErrorCode} 状态字:{_axis.StatusWord} 当前模式:{_axis.ModesOperationDisplay} 当前位置:{_axis.PositionActualValue} 当前速度:{_axis.VelocityActualValue} 控制字:{_axis.Controlword} 设置模式:{_axis.ModesOperation} 设置位置:{_axis.TargetPosition} 设置速度:{_axis.ProfileVelocity} 设置加速度:{_axis.ProfileAcceleration} 设置减速度:{_axis.ProfileDeceleration} 快速停机:{_axis.QuickOptionCode} 停止代码:{_axis.HaltOptionCode} 伺服无故障:{_axis.AxisState.ReadyToSwitchOn} 等待打开伺服使能:{_axis.AxisState.SwitchedOn} 伺服运行:{_axis.AxisState.OperationEnabled} 故障:{_axis.AxisState.Fault} 接通主回路电:{_axis.AxisState.VoltageEnabled} 快速停机:{_axis.AxisState.QuickStop} 伺服准备好:{_axis.AxisState.SwitchOnDisabled} 警告:{_axis.AxisState.Warning} 远程控制:{_axis.AxisState.Remote} 目前到达:{_axis.AxisState.TargetReached} 内部软限位状态:{_axis.AxisState.InternalLimitActive} 回原点完成输出:{_axis.AxisState.HomingAttained}");
Thread.Sleep(1000);
}
}
public void Start(string card) {
//初始化主站
EtherCATMaster _etherCATMaster = new EtherCATMaster();
//初始化1个地址为1的驱动器,如果有多个驱动器直接创建对应地址的多个对象即可
EtherCATSlave_CiA402? _axis = new(_etherCATMaster, 3);
var interfaces = _etherCATMaster.GetAvailableInterfaces();
//启动网卡,查找从站数量,参数为网卡名称
int Count = _etherCATMaster.StartActivity(card);
//停止网卡
// _etherCATMaster.StopActivity();
//伺服使能
//_axis.Reset();
_axis.PowerOn();
_axis.Reset();
_axis.Home();
//_axis.MoveAbsolute(-9000, 1000, 1 * 100, 1 * 100);
printPosition(_axis,10);
//伺服去使能
//_axis.PowerOff();
//绝对位置运动参数为: 位置 速度 加速度 减速度(单位:Puls)
_axis.MoveAbsolute(90000, 1000, 1 * 100, 1 * 100);
printPosition(_axis, 10);
//相对位置运动,参数同上
// _axis.MoveRelative(postion, speed, speed * 10, speed * 10);
//扭矩控制,目标扭矩,扭矩斜率
//_axis.TorqueControl(1000, 100);//扭矩控制,单位为百分比
//速度控制,目标速度,加速度,减速度
//_axis.VelocityControl(1000, 100, 100);
//伺服复位
//伺服停止
_axis.Stop(1000);// 停止减速度
//伺服启动回零
//写入寄存器,<写入类型>参数:驱动器地址,索引,子索引,值
//_axis.Master.WriteSDO<byte>(1, 0x6060, 0x00, 6);
//读寄存器,<读取类型>参数:驱动器地址,索引,子索引
//_axis.Master.ReadSDO<int>(1, 0x6060, 0x00);
//获取输入
//_axis.Master.GetInputs(1);//伺服地址
//获取输出
//_axis.Master.GetOutputs(1);//伺服地址
}
}
}
二、测试结果
电机正常运行,且输出日志:
