| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670 |
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- using FluentResults;
- using GSG.NET.Concurrent;
- using GSG.NET.Logging;
- using GSG.NET.Utils;
- using OHV.Common.Events;
- using OHV.Common.Model;
- using OHV.Common.Shareds;
- using OHV.SqliteDAL;
- using Prism.Events;
- using VehicleControlSystem.ControlLayer.Axis;
- using VehicleControlSystem.ControlLayer.Lib.EziPlusE;
- using static OHV.Common.Events.AxisControlEventArgs;
- namespace VehicleControlSystem.ControlLayer
- {
- public class Clamp : ControlObjectBase
- {
- SqliteManager sql = null;
- List<EzAxis> axes = new List<EzAxis>();
- static Logger logger = Logger.GetLogger();
- IEventAggregator eventAggregator;
- TaskCancel taskCancel = new TaskCancel();
- eClampState _clampState;
- public eClampState ClampState
- {
- get { return this._clampState; }
- set { this.SetField( ref this._clampState, value ); }
- }
- public Clamp( SqliteManager sqliteManager, IEventAggregator ea )
- {
- this.sql = sqliteManager;
- this.eventAggregator = ea;
- }
- public void Init()
- {
- this.CreateAxis();
- this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Unsubscribe( ReceivedMessageEvent );
- this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Subscribe( ReceivedMessageEvent );
- }
- void ReceivedMessageEvent( AxisControlEventArgs args )
- {
- if ( args.Dir == AxisControlEventArgs.eEventDir.ToBack )
- {
- Task.Factory.StartNew( () =>
- {
- var arg = ObjectCopyUtils.DeepClone( args );
- switch ( arg.Kind )
- {
- case AxisControlEventArgs.eAxisControlKind.Stop:
- ReqStop();
- break;
- case AxisControlEventArgs.eAxisControlKind.EStop:
- break;
- case AxisControlEventArgs.eAxisControlKind.Move:
- ReqOrderByMove( arg );
- break;
- case AxisControlEventArgs.eAxisControlKind.Jog:
- ReqJog( arg );
- break;
- case AxisControlEventArgs.eAxisControlKind.ServoOn:
- ReqServoOn( arg );
- break;
- case AxisControlEventArgs.eAxisControlKind.ServoOff:
- ReqServoOff( arg );
- break;
- case AxisControlEventArgs.eAxisControlKind.ReqCurrentPosition:
- ReqStartAxisState();
- break;
- case AxisControlEventArgs.eAxisControlKind.ReqStopCurrentPosition:
- taskCancel.Cancel();
- taskCancel.WaitAll();
- break;
- case AxisControlEventArgs.eAxisControlKind.OriginReturn:
- ReqOriginReturn( arg );
- break;
- case AxisControlEventArgs.eAxisControlKind.FaultReset:
- ReqFaultReset( arg );
- break;
- case eAxisControlKind.NONE:
- break;
- case eAxisControlKind.AxisState:
- break;
- case eAxisControlKind.SyncMove:
- ReqSyncMove( arg );
- break;
- case eAxisControlKind.SyncState:
- ReqSyncState( arg );
- break;
- case eAxisControlKind.AllOriginReturn:
- ReqAllOriginReturn();
- break;
- default:
- break;
- }
- } );
- }
- }
- private void ReqStop()
- {
- logger.D( $"JogMove - Stop Command" );
- this.axes.ForEach( x => { x.Stop(); } );
- }
- void PublishEvent( AxisControlEventArgs args )
- {
- args.Dir = AxisControlEventArgs.eEventDir.ToFront;
- this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( args );
- }
- #region Request Method
- private void ReqSyncState( AxisControlEventArgs args )
- {
- var leftPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).ToList();
- var leftLockData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
- var leftUnLockData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_UNLOCK ) ).Single();
- var left = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
- var rightPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT) ).ToList();
- var rightLockData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
- var rightUnLockData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_UNLOCK ) ).Single();
- var right = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
- if ( left.CurrentPosition == leftLockData.Value && right.CurrentPosition == rightLockData.Value )
- this.ClampState = eClampState.LOCK;
- else if ( left.CurrentPosition == leftUnLockData.Value && right.CurrentPosition == rightUnLockData.Value )
- this.ClampState = eClampState.UNLOCK;
- else
- this.ClampState = eClampState.NONE;
- //this.ClampState = eClampState.NONE;
- var msg = new AxisControlEventArgs
- {
- Kind = eAxisControlKind.SyncState
- };
- this.PublishEvent( msg );
- }
- private void ReqSyncMove( AxisControlEventArgs args )
- {
- var result = 0;
- var reply = new AxisControlEventArgs
- {
- Kind = eAxisControlKind.SyncMove
- };
- if ( args.PosDir == ePosDir.Lock )
- {
- result = this.Lock_Sync();
- if ( result == 0 )
- {
- reply.Result = Results.Ok();
- this.ClampState = eClampState.LOCK;
- }
- else
- {
- var alarm = this.sql.AlarmDAL.GetById( result );
- if ( alarm == null )
- alarm = new Alarm() { Name = "UnKnown Alarm", Text = "Not Define" };
- var error = new Error().WithMetadata( "Alarm", alarm );
- reply.Result = Results.Fail( error );
- this.ClampState = eClampState.NONE;
- }
- }
- else
- {
- result = this.Unlock_Sync();
- if ( result == 0 )
- {
- reply.Result = Results.Ok();
- this.ClampState = eClampState.UNLOCK;
- }
- else
- {
- var alarm = this.sql.AlarmDAL.GetById( result );
- if ( alarm == null )
- alarm = new Alarm() { Name = "UnKnown Alarm", Text = "Not Define" };
- var error = new Error().WithMetadata( "Alarm", alarm );
- reply.Result = Results.Fail( error );
- this.ClampState = eClampState.NONE;
- }
- }
- this.PublishEvent( reply );
- }
- private void ReqFaultReset( AxisControlEventArgs args )
- {
- var axis = this.axes.Where( x => x.Config.AxisName.Equals( args.AxisName ) ).FirstOrDefault();
- int resultNo = axis.ResetAmpFault();
- var msg = new AxisControlEventArgs
- {
- AxisName = args.AxisName,
- Dir = AxisControlEventArgs.eEventDir.ToFront,
- Kind = AxisControlEventArgs.eAxisControlKind.FaultReset,
- };
- msg.Result = Results.Ok( "Servo Fault Reset" );
- this.PublishEvent( msg );
- }
- private void ReqServoOn( AxisControlEventArgs args )
- {
- var msg = new AxisControlEventArgs
- {
- AxisName = args.AxisName,
- Dir = AxisControlEventArgs.eEventDir.ToFront,
- Kind = AxisControlEventArgs.eAxisControlKind.ServoOn,
- Result = Results.Ok($"Servo On SUCCESS"),
- };
- var axis = this.axes.Where( x => x.Config.AxisName.Equals( args.AxisName ) ).FirstOrDefault();
- var result = axis.ServoOn();
- if (result != 0)
- msg.Result = Results.Fail($"Servo On FAIL");
-
- this.PublishEvent( msg );
- }
- private void ReqServoOff( AxisControlEventArgs args )
- {
- var axis = this.axes.Where( x => x.Config.AxisName.Equals( args.AxisName ) ).FirstOrDefault();
- axis.ServoOff();
- var msg = new AxisControlEventArgs
- {
- AxisName = args.AxisName,
- Dir = AxisControlEventArgs.eEventDir.ToFront,
- Kind = AxisControlEventArgs.eAxisControlKind.ServoOff,
- };
- msg.Result = Results.Ok( "Servo Off" );
- this.PublishEvent( msg );
- }
- void ReqStartAxisState()
- {
- var task = Task.Factory.StartNew( () =>
- {
- double[] beforePosition = new double[this.axes.Count];
- beforePosition.Initialize();
- while ( !this.taskCancel.Canceled )
- {
- LockUtils.Wait( 500 );
- //int index = 0;
- //this.axes.ForEach(a =>
- //{
- // if (beforePosition[index] != a.CurrentPosition)
- // {
- // beforePosition[index] = a.CurrentPosition;
- // var msg = new AxisControlEventArgs
- // {
- // AxisName = a.Config.AxisName,
- // Dir = AxisControlEventArgs.eEventDir.ToFront,
- // Kind = AxisControlEventArgs.eAxisControlKind.CurrentPosition,
- // CurrentPosition = a.CurrentPosition,
- // };
- // this.PublishEvent(msg);
- // }
- // index++;
- //});
- var msg = new AxisControlEventArgs();
- msg.Kind = AxisControlEventArgs.eAxisControlKind.AxisState;
- msg.Args = new Dictionary<string, object>();
- this.axes.ForEach( a =>
- {
- var state = new AxisState();
- state.IsServoOn = a.IsServoOn();
- state.IsOriginReturn = a.IsOriginReturn();
- state.IsAmpFault = a.IsAmpFault();
- state.CurrentPosition = a.CurrentPosition;
- if ( a.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) )
- msg.Args.Add( "Left", state );
- else
- msg.Args.Add( "Right", state );
- } );
- this.PublishEvent( msg );
- }
- } );
- this.taskCancel.Add( task );
- }
- void ReqJog( AxisControlEventArgs arg )
- {
- var velocity = arg.JogVelocity;
- if ( arg.JogDir == AxisControlEventArgs.eJogMoveDir.Positive )
- this.JogMove( arg.AxisName, E_JogMoveDir.Positive, velocity );
- else
- this.JogMove( arg.AxisName, E_JogMoveDir.Negative, velocity );
- }
- void ReqOriginReturn( AxisControlEventArgs arg )
- {
- int result = 0;
- if ( arg.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) )
- result = this.LeftOriginReturn();
- else
- result = this.RightOriginReturn();
- var msg = new AxisControlEventArgs
- {
- AxisName = arg.AxisName,
- Kind = AxisControlEventArgs.eAxisControlKind.OriginReturn,
- };
- if ( result != EziMOTIONPlusELib.FMM_OK )
- msg.Result = Results.Fail( "Origin Fail" );
- else
- msg.Result = Results.Ok();
- this.PublishEvent( msg );
- }
- void ReqAllOriginReturn()
- {
- var msg = new AxisControlEventArgs
- {
- Kind = eAxisControlKind.AllOriginReturn
- };
- var result = this.AllOriginReturn();
- result = this.IsAllAxisOriginReturn();
- if ( result == 5 )
- msg.Result = Results.Fail( "Left Fail" );
- else if ( result == 6 )
- msg.Result = Results.Fail( "Right Fail" );
- else if ( result <= 0 )
- msg.Result = Results.Ok();
- this.PublishEvent( msg );
- }
- void ReqOrderByMove( AxisControlEventArgs arg )
- {
- var msg = new AxisControlEventArgs();
- msg.Kind = AxisControlEventArgs.eAxisControlKind.Move;
- msg.PosDir = arg.PosDir;
- int result = 0;
- if ( arg.PosDir == AxisControlEventArgs.ePosDir.Lock )
- {
- result = this.MoveToLockPosition( arg.AxisName );
- if ( result != 0 )
- {
- var alarm = this.sql.AlarmDAL.GetById( result );
- if ( alarm == null )
- alarm = new Alarm() { Name = "Unknown Alarm", Text = "Not define" };
- var error = new Error().WithMetadata( "Alarm", alarm );
- msg.Result = Results.Fail( error );
- }
- else
- {
- msg.Result = Results.Ok();
- }
- }
- else
- {
- result = this.MoveToUnlockPosition( arg.AxisName );
- if ( result != 0 )
- {
- var alarm = this.sql.AlarmDAL.GetById( result );
- if ( alarm == null )
- alarm = new Alarm() { Name = "Unknown Alarm", Text = "Not define" };
- var error = new Error().WithMetadata( "Alarm", alarm );
- msg.Result = Results.Fail( error );
- }
- else
- {
- msg.Result = Results.Ok();
- }
- }
- this.PublishEvent( msg );
- }
- #endregion
- public void ClampEStop()
- {
- this.axes.ForEach( x => { x.EmergencyStop(); } );
- }
- void CreateAxis()
- {
- sql.AxisConfigDAL.GetAll().ToList().ForEach( config =>
- {
- Axis.AxisConfig c = new Axis.AxisConfig
- {
- AxisName = config.Name,
- Scale = config.Scale,
- Address = config.Address,
- AxisNo = config.Id,
- };
- //if ( config.Name.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) )
- // c.AxisNo = 40;
- //else
- // c.AxisNo = 41;
- axes.Add( new EzAxis( c ) );
- } );
- this.axes.ForEach( axis =>
- {
- var data = sql.AxisVelocityDataDAL.Get( x => x.AxisName.Equals( axis.Config.AxisName ) ).FirstOrDefault();
- Axis.AxisData axisData = new AxisData
- {
- AxisNo = data.id,
- AxisName = data.AxisName,
- AutoRunVelocity = data.AutoRunVelocity,
- AutoRunAccelerate = data.AutoRunAccelerate,
- AutoRunDecelerate = data.AutoRunDecelerate,
- ManualRunVelocity = data.ManualRunVelocity,
- JogFast = data.JogFast,
- JogSlow = data.JogSlow,
- Tolerance = data.Tolerance,
- };
- axis.Initialize( axisData );
- } );
- }
- public int LeftOriginReturn()
- {
- var servo = this.axes.Where( s => s.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
- return servo.OriginReturn( true );
- }
- public int RightOriginReturn()
- {
- var servo = this.axes.Where( s => s.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
- return servo.OriginReturn( true );
- }
- public int AllOriginReturn()
- {
- int result = 0;
- this.axes.ForEach( axis =>
- {
- if ( axis.IsAmpFault() )
- axis.ResetAmpFault();
- Thread.Sleep( 500 );
- if ( axis.IsServoOff() )
- axis.ServoOn();
- } );
- Thread.Sleep( 500 );
- result = LeftOriginReturn();
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 7;
- LockUtils.Wait(500);
- result = RightOriginReturn();
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 8;
- LockUtils.Wait( 500 );
- var sw = SwUtils.CurrentTimeMillis;
- while ( true )
- {
- LockUtils.Wait( 5 );
- if ( SwUtils.Gt( sw, 10000 ) )
- break;
- if ( this.axes.Any( axis => axis.IsAmpFault() ) )
- break;
- if ( this.axes.All( a => a.IsAxisDone() ) )
- break;
- }
- return result;
- }
- public int IsAllAxisOriginReturn()
- {
- int result = 0;
- this.axes.ForEach( x =>
- {
- if ( !x.IsOriginReturn() )
- {
- if ( x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) )
- result = 5;
- else
- result = 6;
- return;
- }
- if ( x.IsServoOff())
- {
- if ( x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) )
- result = 5;
- else
- result = 6;
- return;
- }
- } );
- return result;
- }
- #region Data
- public void SavePositionData( string pos, double left, double right )
- {
- var dataList = sql.AxisPositionDataDAL.Get(x=>x.Name.Equals( pos) );
- var sqlLeft = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
- var sqlRight = dataList.Where( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
- sqlLeft.Value = left;
- sql.AxisPositionDataDAL.Update( sqlLeft );
- sqlRight.Value = right;
- sql.AxisPositionDataDAL.Update( sqlRight );
- }
- #endregion
- public int JogMove( string axisName, E_JogMoveDir dir, int velocity )
- {
- //logger.D( $"JogMove - Axis[{axisName}] / Dir[{dir}] / vel[{velocity}]" );
- var axis = this.axes.Where( x => x.Config.AxisName.Equals( axisName ) ).Single();
- return axis.JogMove( dir, velocity );
- }
- public int MoveToLockPosition( string axisName )
- {
- var servo = this.axes.Where( x => x.Config.AxisName.Equals( axisName ) ).Single();
- var axisPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.AxisName.Equals( axisName )).ToList();
- var data = axisPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
- int result = servo.Move( data.Value );
- return result;
- }
- public int MoveToUnlockPosition( string axisName )
- {
- var servo = this.axes.Where( x => x.Config.AxisName.Equals( axisName ) ).Single();
- var axisPositionDatas = sql.AxisPositionDataDAL.Get( x => x.AxisName.Equals( axisName ) ).ToList();
- var data = axisPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_UNLOCK ) ).Single();
- int result = servo.Move( data.Value );
- return result;
- }
- /// <summary>
- /// 두개를 동시에 Lock
- /// </summary>
- /// <returns></returns>
- public int Lock_Sync()
- {
- #if SIMULATION
- Thread.Sleep(2000);
- #else
- int result = 0;
- result = this.IsAllAxisOriginReturn();
- if ( result != 0 )
- return result;
- var leftPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT) ).ToList();
- var leftData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
- var left = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
- var rightPositionDatas = sql.AxisPositionDataDAL.Get( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).ToList();
- var rightData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_LOCK ) ).Single();
- var right = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
- result = left.StartMove( leftData.Value, 0 );
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 1;
- result = right.StartMove( rightData.Value, 0 );
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 3;
- result = left.Wait4Done();
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 1;
- result = right.Wait4Done();
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 1;
- #endif
- this.ClampState = eClampState.LOCK;
- return EziMOTIONPlusELib.FMM_OK;
- }
- /// <summary>
- /// 두개의 Axis 를 동시에 Unlock
- /// </summary>
- /// <returns></returns>
- public int Unlock_Sync()
- {
- #if SIMULATION
- Thread.Sleep(2000);
- #else
- int result = 0;
- result = this.IsAllAxisOriginReturn();
- if ( result != 0 )
- return result;
- var leftPositionDatas = sql.AxisPositionDataDAL.Get(x=>x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT) ).ToList();
- var leftData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_UNLOCK ) ).Single();
- var left = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_LEFT ) ).Single();
- var rightPositionDatas = sql.AxisPositionDataDAL.Get( x => x.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).ToList();
- var rightData = leftPositionDatas.Where( x => x.Name.Equals( ConstString.TEACH_POSITION_UNLOCK ) ).Single();
- var right = this.axes.Where( x => x.Config.AxisName.Equals( ConstString.AXIS_CARRIER_LOCK_RIGHT ) ).Single();
- result = left.StartMove( leftData.Value, 0 );
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 2;
- result = right.StartMove( rightData.Value, 0 );
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 4;
- result = left.Wait4Done();
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 2;
- result = right.Wait4Done();
- if ( result != EziMOTIONPlusELib.FMM_OK )
- return 4;
- #endif
- this.ClampState = eClampState.UNLOCK;
- return EziMOTIONPlusELib.FMM_OK;
- }
- }
- }
|