using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using TeamAAS.Robot.Core.Robots; using TeamAAS.Robot.Enums; using TeamAAS.Robot.Interfaces; using TeamAAS.Robot.Models; using TeamAAS.Robot.Attributes; using TeamAAS.Communication.Enums; using static TeamAAS.Robot.Core.CoordinateTransformer; namespace TeamAAS.Robot.Core.Robots { [Robot("Schneider", RobotBrand.Schneider)] public class SchneiderRobot : IRobot, INotifyPropertyChanged { private RobotTcpClient _tcp; public event Action ConnectedEvent; public event Action DisconnectedEvent; public event Action ReceivedEvent; public event Action SendEvent; public SchneiderRobot(RobotInfo robot) { Id = robot.Id; Name = robot.RobotName; RobotNo = robot.RobotNo; RobotIp = robot.IP; RobotPort = robot.Port; ConnectType = robot.ConnectType; Terminator = robot.Terminator; DataEncoding = robot.DataEncoding; Brand = robot.RobotBrand; _tcp = new RobotTcpClient(RobotIp, RobotPort, ConnectType, Terminator, DataEncoding); _tcp.OnConnected += Tcp_OnConnected; _tcp.OnDisconnected += Tcp_OnDisconnected; _tcp.OnReceived += Tcp_OnReceived; _tcp.OnSent += Tcp_OnSent; } #region 属性 public RobotTcpClient Tcp => _tcp; public Guid Id { get; set; } public string Name { get; set; } /// /// 机器人编号 /// public int RobotNo { get; set; } public int RobotPort { get; private set; } public string RobotIp { get; private set; } public TCPConnectType ConnectType { get; private set; } public Terminator Terminator { get; private set; } public DataEncoding DataEncoding { get; private set; } public bool IsConnected { get { return _tcp.IsConnected; } } public int Timeout { get; set; } = 5000; private bool _CanExecute = false; public bool CanExecute { get { return _CanExecute; } set { SetProperty(ref _CanExecute, value); } } public int SelectedTool { get; private set; } = 0; public RobotBrand Brand { get; private set; } /// /// 进入调试模式 /// /// public bool EnterDebugMode { get; set; } #endregion #region 事件接收 private void Tcp_OnConnected(byte[] data) { CanExecute = true; ConnectedEvent?.Invoke(this.Id, _tcp, data); } private void Tcp_OnDisconnected(byte[] data) { CanExecute = false; DisconnectedEvent?.Invoke(this.Id, _tcp, data); } private void Tcp_OnReceived(byte[] data) { ReceivedEvent?.Invoke(this.Id, _tcp, data); } private void Tcp_OnSent(string data) { SendEvent?.Invoke(this.Id, _tcp, data); } #endregion #region 连接 public void Connect() { _tcp.Connect(); } public async Task ConnectAsync() { await _tcp.ConnectAsync(); } public void Disconnect() { _tcp.Disconnect(); } public void Dispose() { _tcp?.Dispose(); } #endregion #region 控制 public bool Reset() { try { CanExecute = false; string rev = SendAndReceive($"Reset"); if (rev.Contains("Reset")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task ResetAsync() { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Reset"); if (rev.Contains("Reset")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Motor(bool state) { try { CanExecute = false; int v = state ? 1 : 0; string rev = SendAndReceive($"Motor,{v}"); if (rev.Contains("Motor")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task MotorAsync(bool state) { try { CanExecute = false; int v = state ? 1 : 0; string rev = await SendAndReceiveAsync($"Motor,{v}"); if (rev.Contains("Motor")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Power(bool state) { try { CanExecute = false; int v = state ? 1 : 0; string rev = SendAndReceive($"Power,{v}"); if (rev.Contains("Power")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task PowerAsync(bool state) { try { CanExecute = false; int v = state ? 1 : 0; string rev = await SendAndReceiveAsync($"Power,{v}"); if (rev.Contains("Power")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Speed(int value) { try { CanExecute = false; string rev = SendAndReceive($"Speed,{value}"); if (rev.Contains("Speed")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task SpeedAsync(int value) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Speed,{value}"); if (rev.Contains("Speed")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Speedfactor(int value) { try { CanExecute = false; string rev = SendAndReceive($"Speedfactor,{value}"); if (rev.Contains("Speedfactor")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task SpeedfactorAsync(int value) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Speedfactor,{value}"); if (rev.Contains("Speedfactor")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Speeds(double value) { try { CanExecute = false; string rev = SendAndReceive($"Speeds,{value}"); if (rev.Contains("Speeds")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task SpeedsAsync(double value) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Speeds,{value}"); if (rev.Contains("Speeds")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Accel(int value) { try { CanExecute = false; string rev = SendAndReceive($"Accel,{value},{value}"); if (rev.Contains("Accel")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task AccelAsync(int value) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Accel,{value},{value}"); if (rev.Contains("Accel")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Accels(double value) { try { CanExecute = false; string rev = SendAndReceive($"Accels,{value},{value}"); if (rev.Contains("Accels")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task AccelsAsync(double value) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Accels,{value},{value}"); if (rev.Contains("Accels")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public RPoint GetRobotPos() { try { CanExecute = false; string rev = SendAndReceive($"GetRobotPos"); if (rev.Contains("GetRobotPos")) { RPoint point = new RPoint(); var items = rev.Split(','); point.X = Convert.ToSingle(items[1]); point.Y = Convert.ToSingle(items[2]); point.Z = Convert.ToSingle(items[3]); point.U = Convert.ToSingle(items[4]); point.V = Convert.ToSingle(items[5]); point.W = Convert.ToSingle(items[6]); point.Hand = (RobotHand)Convert.ToInt32(items[7]); point.Local = Convert.ToInt32(items[8]); point.Tool = Convert.ToInt32(items[9]); return point; } else return null; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task GetRobotPosAsync() { try { CanExecute = false; string rev = await SendAndReceiveAsync($"GetRobotPos"); if (rev.Contains("GetRobotPos")) { RPoint point = new RPoint(); var items = rev.Split(','); point.X = Convert.ToSingle(items[1]); point.Y = Convert.ToSingle(items[2]); point.Z = Convert.ToSingle(items[3]); point.U = Convert.ToSingle(items[4]); point.V = Convert.ToSingle(items[5]); point.W = Convert.ToSingle(items[6]); point.Hand = (RobotHand)Convert.ToInt32(items[7]); point.Local = Convert.ToInt32(items[8]); point.Tool = Convert.ToInt32(items[9]); return point; } else return null; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Jog(string axis, double distance) { try { CanExecute = false; string rev = SendAndReceive($"Jog,{axis},{distance}"); if (rev.Contains("Jog")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task JogAsync(string axis, double distance) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Jog,{axis},{distance}"); if (rev.Contains("Jog")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Joint(int joint, double distance) { try { CanExecute = false; string rev = SendAndReceive($"Joint,{joint},{distance}"); if (rev.Contains("Joint")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task JointAsync(int joint, double distance) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Joint,{joint},{distance}"); if (rev.Contains("Joint")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Go(RPoint position) { try { CanExecute = false; string rev = SendAndReceive($"Go,{position.X},{position.Y},{position.Z},{position.U},{position.V},{position.W},{(int)position.Hand},{position.Local},{position.Tool}"); if (rev.Contains("Go")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task GoAsync(RPoint position) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Go,{Math.Round(position.X, 3)},{Math.Round(position.Y, 3)},{Math.Round(position.Z, 3)},{Math.Round(position.U, 3)},{Math.Round(position.V, 3)},{Math.Round(position.W, 3)},{(int)position.Hand},{position.Local},{position.Tool}"); if (rev.Contains("Go")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Jump(RPoint position, double? LimZ) { try { CanExecute = false; double limz = LimZ == null ? 0 : (double)LimZ; string rev = SendAndReceive($"Jump,{Math.Round(position.X, 3)},{Math.Round(position.Y, 3)},{Math.Round(position.Z, 3)},{Math.Round(position.U, 3)},{Math.Round(position.V, 3)},{Math.Round(position.W, 3)},{(int)position.Hand},{position.Local},{position.Tool},{Math.Round(limz, 3)}"); if (rev.Contains("Jump")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task JumpAsync(RPoint position, double? LimZ) { try { CanExecute = false; double limz = LimZ == null ? 0 : (double)LimZ; string rev = await SendAndReceiveAsync($"Jump,{Math.Round(position.X, 3)},{Math.Round(position.Y, 3)},{Math.Round(position.Z, 3)},{Math.Round(position.U, 3)},{Math.Round(position.V, 3)},{Math.Round(position.W, 3)},{(int)position.Hand},{position.Local},{position.Tool},{Math.Round(limz, 3)}"); if (rev.Contains("Jump")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool Move(RPoint position) { try { CanExecute = false; string rev = SendAndReceive($"Move,{position.X},{position.Y},{position.Z},{position.U},{position.V},{position.W},{(int)position.Hand},{position.Local},{position.Tool}"); if (rev.Contains("Move")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task MoveAsync(RPoint position) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"Move,{Math.Round(position.X, 3)},{Math.Round(position.Y, 3)},{Math.Round(position.Z, 3)},{Math.Round(position.U, 3)},{Math.Round(position.V, 3)},{Math.Round(position.W, 3)},{(int)position.Hand},{position.Local},{position.Tool}"); if (rev.Contains("Move")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool SFree() { try { CanExecute = false; string rev = SendAndReceive($"SFree"); if (rev.Contains("SFree")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task SFreeAsync() { try { CanExecute = false; string rev = await SendAndReceiveAsync($"SFree"); if (rev.Contains("SFree")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool SLock() { try { CanExecute = false; string rev = SendAndReceive($"SLock"); if (rev.Contains("SLock")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task SLockAsync() { try { CanExecute = false; string rev = await SendAndReceiveAsync($"SLock"); if (rev.Contains("SLock")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool CalibMotion(RPoint position, double? LimZ) { try { CanExecute = false; double limz = LimZ == null ? 0 : (double)LimZ; string rev = SendAndReceive($"CalibMotion,{position.X},{position.Y},{position.Z},{position.U},{position.V},{position.W},{(int)position.Hand},{position.Local},{position.Tool},{limz}"); if (rev.Contains("CalibMotion")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task CalibMotionAsync(RPoint position, double? LimZ) { try { CanExecute = false; double limz = LimZ == null ? 0 : (double)LimZ; string rev = await SendAndReceiveAsync($"CalibMotion,{Math.Round(position.X, 3)},{Math.Round(position.Y, 3)},{Math.Round(position.Z, 3)},{Math.Round(position.U, 3)},{Math.Round(position.V, 3)},{Math.Round(position.W, 3)},{(int)position.Hand},{position.Local},{position.Tool},{Math.Round(limz, 2)}"); if (rev.Contains("CalibMotion")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool CalibOutIO(bool state) { try { CanExecute = false; int va = state ? 1 : 0; string rev = SendAndReceive($"CalibOutIO,{va}"); if (rev.Contains("CalibOutIO")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task CalibOutIOAsync(bool state) { try { CanExecute = false; int va = state ? 1 : 0; string rev = await SendAndReceiveAsync($"CalibOutIO,{va}"); if (rev.Contains("CalibOutIO")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public bool CalibParame(PickInfo Pick, int Speed, int Accel, bool Power, int WaitSuction, int WaitBlow) { try { CanExecute = false; int va = Power ? 1 : 0; string rev = SendAndReceive($"CalibParame,{(int)Pick.PickPlaceModel},{Pick.Inhal},{Pick.Blow},{Speed},{Accel},{va},{WaitSuction},{WaitBlow}"); if (rev.Contains("CalibParame")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } public async Task CalibParameAsync(PickInfo Pick, int Speed, int Accel, bool Power, int WaitSuction, int WaitBlow) { try { CanExecute = false; int va = Power ? 1 : 0; string rev = await SendAndReceiveAsync($"CalibParame,{(int)Pick.PickPlaceModel},{Pick.Inhal},{Pick.Blow},{Speed},{Accel},{va},{WaitSuction},{WaitBlow}"); if (rev.Contains("CalibParame")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } /// /// 设置工具坐标 /// /// /// /// /// public bool SetTool(int index, double x, double y) { try { CanExecute = false; string rev = SendAndReceive($"SetTool,{index},{x},{y}"); if (rev.Contains("SetTool")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } /// /// 设置工具坐标 /// /// /// /// /// public async Task SetToolAsync(int index, double x, double y) { try { CanExecute = false; string rev = await SendAndReceiveAsync($"SetTool,{index},{Math.Round(x, 3)},{Math.Round(y, 3)}"); if (rev.Contains("SetTool")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } /// /// 选择工具坐标 /// /// /// public bool SelectTool(int index) { try { SelectedTool = index; CanExecute = false; string rev = SendAndReceive($"SelectTool,{index}"); if (rev.Contains("SetTool")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } /// /// 选择工具坐标 /// /// /// public async Task SelectToolAsync(int index) { { try { SelectedTool = index; CanExecute = false; string rev = await SendAndReceiveAsync($"SelectTool,{index}"); if (rev.Contains("SetTool")) return true; else return false; } catch (Exception ex) { // LogHelper removed CanExecute = true; throw ex; } finally { CanExecute = true; } } } #endregion #region 收发数据 public string SendAndReceive(string send) { return _tcp.SendAndReceive(send, Timeout); } public async Task SendAndReceiveAsync(string send) { return await _tcp.SendAndReceiveAsync(send, Timeout); } public void Send(string send) { _tcp.Send(send); } public async Task SendAsync(string send) { await _tcp.SendAsync(send); } public Encoding GetEncoding() { return _tcp.GetEncoding(); } #endregion #region 属性通知 /// /// Occurs when a property value changes. /// public event PropertyChangedEventHandler PropertyChanged; /// /// Checks if a property already matches a desired value. Sets the property and /// notifies listeners only when necessary. /// /// Type of the property. /// Reference to a property with both getter and setter. /// Desired value for the property. /// Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers that /// support CallerMemberName. /// True if the value was changed, false if the existing value matched the /// desired value. protected virtual bool SetProperty(ref T storage, T value, [CallerMemberName] string propertyName = null) { if (EqualityComparer.Default.Equals(storage, value)) return false; storage = value; RaisePropertyChanged(propertyName); return true; } /// /// Checks if a property already matches a desired value. Sets the property and /// notifies listeners only when necessary. /// /// Type of the property. /// Reference to a property with both getter and setter. /// Desired value for the property. /// Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers that /// support CallerMemberName. /// Action that is called after the property value has been changed. /// True if the value was changed, false if the existing value matched the /// desired value. protected virtual bool SetProperty(ref T storage, T value, Action onChanged, [CallerMemberName] string propertyName = null) { if (EqualityComparer.Default.Equals(storage, value)) return false; storage = value; onChanged?.Invoke(); RaisePropertyChanged(propertyName); return true; } /// /// Raises this object's PropertyChanged event. /// /// Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers that /// support . protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } /// /// Raises this object's PropertyChanged event. /// /// The PropertyChangedEventArgs protected virtual void OnPropertyChanged(PropertyChangedEventArgs args) { PropertyChanged?.Invoke(this, args); } public List GetNodesValue() { throw new NotImplementedException(); } #endregion } }