80 lines
2.9 KiB
C#
80 lines
2.9 KiB
C#
using System;
|
|
using System.Data;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using ln.application;
|
|
using ln.ethercat.controller;
|
|
using ln.ethercat.controller.drives;
|
|
using ln.ethercat.controller.remote;
|
|
using ln.logging;
|
|
using ln.type;
|
|
|
|
namespace ln.ethercat.service
|
|
{
|
|
class Program
|
|
{
|
|
[StaticArgument(LongOption = "serial-remote")]
|
|
static string SerialRemotePort { get; set; }
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
Logging.Log(LogLevel.INFO, ".NET EtherCAT service host");
|
|
|
|
StringBuilder versionString = new StringBuilder(1024);
|
|
ECMBind.ecmbind_version(versionString);
|
|
|
|
Logging.Log(LogLevel.INFO, "ECMBind version: {0}", versionString.ToString());
|
|
|
|
EthercatService ethercatService = new EthercatService(args[0]);
|
|
|
|
ArgumentContainer argumentContainer = new ArgumentContainer();
|
|
argumentContainer.AddStaticOptions<Program>();
|
|
argumentContainer.AddOptions(ethercatService);
|
|
argumentContainer.Parse(ref args);
|
|
|
|
ethercatService.Initialize();
|
|
ethercatService.ECMaster.OnStateChange += (ECMaster ECMaster, ECSlaveState newState) => {
|
|
if (newState == ECSlaveState.OPERATIONAL)
|
|
{
|
|
ECMaster.DriveControllers[1].IgnoredByController = true;
|
|
|
|
if (ECMaster.GetSDOValue(1, 0x2012, 32, out SDOValue svEnableDrives))
|
|
{
|
|
svEnableDrives.SetValue((byte)0x00);
|
|
}
|
|
|
|
} else if (newState == ECSlaveState.PRE_OP)
|
|
{
|
|
ECMaster.RequestPDOMapping(1, 0x2012, 31, true);
|
|
ECMaster.RequestPDOMapping(1, 0x2012, 32, true);
|
|
}
|
|
};
|
|
|
|
ethercatService.ECMaster.Controller.OnStateChanged += (controller, state) => {
|
|
Logging.Log(LogLevel.DEBUG, "ControllerState=={0}", state);
|
|
|
|
if (state == ControllerStates.NOTREADY)
|
|
{
|
|
if (controller.ECMaster.GetSDOValue(1, 0x2012, 32, out SDOValue svEnableDrives))
|
|
{
|
|
Logging.Log(LogLevel.DEBUG, "ControllerState=={0} powering up enable signals", state);
|
|
svEnableDrives.SetValue((byte)0x01);
|
|
}
|
|
} else if (state == ControllerStates.READY)
|
|
{
|
|
controller.ECMaster.DriveControllers[1].DriveMode = DriveMode.TORQUE;
|
|
}
|
|
};
|
|
|
|
ethercatService.Start();
|
|
|
|
|
|
if (SerialRemotePort != null)
|
|
{
|
|
StupidSerialRemote stupidSerialRemote = new StupidSerialRemote(ethercatService.ECMaster.Controller, SerialRemotePort);
|
|
stupidSerialRemote.Start();
|
|
}
|
|
}
|
|
}
|
|
}
|