using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel.Design; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using Team.FFFeederService.Enums; using Team.FFFeederService.Interfaces; using Team.FFFeederService.Models; using TouchSocket.Core; using TouchSocket.Sockets; namespace Team.FFFeederService { /// /// Feeder 参数读写控制 /// public class TeamFeeder : IVoiceCoilMotorFeeder { #region 字段 /// /// 背光打开命令 /// private const string LightOpenCommand = "{K1}"; /// /// 背光关闭命令 /// private const string LightCloseCommand = "{K0}"; /// /// 查询背光状态命令 /// private const string QueryLightStateCommand = "{K?}"; /// /// 平台振动参数起始地址 /// private const int ShakeParamStartAddress = 300; /// /// 料斗振动参数起始地址 /// private const int HopperParamStartAddress = 742; /// /// 序列参数起始地址 /// private const int SequenceParamStartAddress = 950; private IWaitingClient WaitClient; //private bool isFirstConnect = true; private Task bgConnectTask; #endregion #region 属性 public FeederBrand FeederBrand { get => FeederBrand.TEAM; } public FeederModel FeederModel { get; private set; } = FeederModel.Unknown; public Guid Id { get; set; } public int FeederNo { get; set; } public string Name { get; set; } /// /// Feeder连接状态 /// public bool IsConnected => TcpClient.Online; /// /// Feeder是否首次连接成功 /// public bool IsInit { get; private set; } /// /// Feeder IP地址 /// public string FeederIp => TcpClient.IP; /// /// Feeder 端口 /// public int FeederPort => TcpClient.Port; /// /// 接收数据的超时时间 /// public int MillisecondsTimeout = 5000; //接收数据超时时间 /// /// TCP客户端通讯 /// public TcpClient TcpClient { get; } #endregion // private const string SelectOneShakeCommand = "{UV1}\r\n"; #region 事件 /// /// Feeder连接状态更改事件 /// public event Action FeederConnectionStatusChanged; #endregion public TeamFeeder(Guid id, int feederNo, string name, TcpClient tcpClient) { Id = id; FeederNo = feederNo; Name = name; TcpClient = tcpClient; //调用CreateWaitingClient获取到IWaitingClient的对象。 WaitClient = tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回 { return true; //if (response.Data.Length == 1) //{ // return true; //} //return false; } }); TcpClient.Connected = ConnectedVoid; TcpClient.Closed = DisconnectedVoid; } #region 方法 #region Feeder 连接 /// /// 连接Feeder /// public void Connect() { try { TcpClient.Connect(); IsInit = true; //isFirstConnect = false; } catch (Exception) { IsInit = false; if (bgConnectTask == null) { bgConnectTask = Task.Run(async () => { while (true) { try { TcpClient.Connect(); //isFirstConnect = false; return; } catch (Exception) { await Task.Delay(1000); } } }); } throw; } } /// /// 连接Feeder /// /// public async Task ConnectAsync() { try { await TcpClient.ConnectAsync(); IsInit = true; //isFirstConnect = false; } catch (Exception) { IsInit = false; if (bgConnectTask == null) { bgConnectTask = Task.Run(async () => { while (true) { try { TcpClient.Connect(); //isFirstConnect = false; return; } catch (Exception) { await Task.Delay(1000); } } }); } throw; } } #endregion public void Reset() { } public Task ResetAsync() { return Task.CompletedTask; } #region 振动集 /// /// 选择使用振动集 /// /// /// public void SelectShakeParam(int id) { var sendCommand = "{UV" + id + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); if (result.TrimEnd() != sendCommand.TrimEnd()) { throw new Exception("FFFeeder响应不正确"); } } /// /// 选择使用振动集 /// /// /// /// public async Task SelectShakeParamAsync(int id) { var sendCommand = "{UV" + id + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); if (result.TrimEnd() != sendCommand.TrimEnd()) { throw new Exception("FFFeeder响应不正确"); } } /// /// 将振动集参数存储至非易失内存中 /// /// /// public async Task SaveShakeSetAsync() { string sendCommand = "{DV}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); if (result.TrimEnd() != sendCommand.TrimEnd()) { throw new Exception("FFFeeder响应不正确"); } } /// /// 查询当前选择的振动集 /// /// public int GetSelectedShakeParam() { const string sendCommand = "{UV?}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } /// /// 查询当前选择的振动集 /// /// public async Task GetSelectedShakeParamAsync() { const string sendCommand = "{UV?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } #endregion #region 平台振动参数 //300~741 //300 A 平台振动 A 振幅 1 //301 A 平台振动 A 频率 1 //302 A 平台振动 A 相位 1 //303 A 平台振动 A 波形 1 //304 A 平台振动 A 振幅 2 //305 A 平台振动 A 频率 2 //306 A 平台振动 A 相位 2 //307 A 平台振动 A 波形 2 //308 A 平台振动 A 振幅 3 //309 A 平台振动 A 频率 3 //310 A 平台振动 A 相位 3 //311 A 平台振动 A 波形 3 //312 A 平台振动 A 振幅 4 //313 A 平台振动 A 频率 4 //314 A 平台振动 A 相位 4 //315 A 平台振动 A 波形 4 //316 A 平台振动 A 持续时间 //300+17*n /// /// 选择要使用的振动集(1~26) /// /// /// public bool LoadShakeSet(int v) { var command = "{UV" + v + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); return result == command; } /// /// 选择要使用的振动集(1~26) /// /// /// public async Task LoadShakeSetAsync(int v) { var command = "{UV" + v + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); return result == command; } /// /// 执行平台振动 /// /// /// public async Task StartAction(int index, int? timespan = null) { if (index < 0 || index > 25) { index = 0; } char chn = (char)('A' + index); string actionCommand = $"C{chn}"; return await RunFromCommand(actionCommand, timespan); } /// /// 停止平台振动 /// public void Stop() { WaitClient.SendThenReturn(Encoding.ASCII.GetBytes("{HC}"), MillisecondsTimeout); } /// /// 停止平台振动 /// /// public Task StopAsync() { return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes("{HC}"), MillisecondsTimeout); } /// /// 向前 /// /// /// public async Task RunToLeftAsync(int? timespan = null) { var command = "{CA" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CA", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 左前 /// /// /// public async Task RunToBottomLeftAsync(int? timespan = null) { var command = "{CB" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CB", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 右前 /// /// /// public async Task RunToTopLeftAsync(int? timespan = null) { var command = "{CC" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CC", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 向左 /// /// /// public async Task RunToBottomAsync(int? timespan = null) { var command = "{CD" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CD", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 向右 /// /// /// public async Task RunToTopAsync(int? timespan = null) { var command = "{CE" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CE", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 向后 /// /// /// public async Task RunToRightAsync(int? timespan = null) { var command = "{CF" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CF", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 左后 /// /// /// public async Task RunToBottomRightAsync(int? timespan = null) { var command = "{CG" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CG", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 右后 /// /// /// public async Task RunToTopRightAsync(int? timespan = null) { var command = "{CH" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CH", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 散开 /// /// /// public async Task RunToFlipAsync(int? timespan = null) { var command = "{CI" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CI", ""); return string.IsNullOrEmpty(timeSpan) ? 0 : int.Parse(timeSpan); } /// /// 横向聚中 /// /// 持续时间 /// public async Task RunToInnerVerticalAsync(int? timespan = null) { var command = "{CJ" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CJ", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 纵向聚中 /// /// /// public async Task RunToInnerHorizonAsync(int? timespan = null) { var command = "{CK" + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CK", ""); if (string.IsNullOrEmpty(timeSpan)) { return 0; } return int.Parse(timeSpan); } /// /// 读一个振动动作值 /// /// /// public SingleActionParam GetShakeGroupValue(int index) { if (index < 0 || index > 25) { index = 0; } return GetShakeGroupValueAsync(index).GetAwaiter().GetResult(); } /// /// 读一个振动动作值 /// /// /// public async Task GetShakeGroupValueAsync(int index) { var results = new string[17]; for (var j = 0; j < 17; j++) { var id = index * 17 + ShakeParamStartAddress + j; var command = "{RP" + id + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); results[j] = result.TrimEnd().Replace("{RP", "").Replace("}", "").Split(":")[1]; } int i = 0; SingleActionParam actionParam=new SingleActionParam(); actionParam.Motor1 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency= ushort.Parse(results[i+1]), Phase = ushort.Parse(results[i + 2]), WaveShape= (WaveShape)ushort.Parse(results[i + 3]) }; i = 4; actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency = ushort.Parse(results[i + 1]), Phase = ushort.Parse(results[i + 2]), WaveShape = (WaveShape)ushort.Parse(results[i + 3]) }; i = 8; actionParam.Motor3 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency = ushort.Parse(results[i + 1]), Phase = ushort.Parse(results[i + 2]), WaveShape = (WaveShape)ushort.Parse(results[i + 3]) }; i = 12; actionParam.Motor4 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency = ushort.Parse(results[i + 1]), Phase = ushort.Parse(results[i + 2]), WaveShape = (WaveShape)ushort.Parse(results[i + 3]) }; actionParam.DurationValue = int.Parse(results[16]); return actionParam; } /// /// 获取单个动作持续时间 /// /// /// public int GetDuration(int id) { var idInServer = id * 17 + 316; var command = "{RP" + idInServer + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var value = result.TrimEnd().Replace("{RP", "").Replace("}", "").Split(':')[1]; return int.Parse(value); } /// /// 获取单个动作持续时间 /// /// /// public async Task GetDurationAsync(int id) { var idInServer = id * 17 + 316; var command = "{RP" + idInServer + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var value = result.TrimEnd().Replace("{RP", "").Replace("}", "").Split(':')[1]; return int.Parse(value); } /// /// 写入振动单个参数 /// /// /// /// /// public async Task SetShakeParametersAsync(int selectedShakeMotion, int id, string value) { var commandId = 300 + selectedShakeMotion * 17 + id; var command = "{WP" + $"{commandId}={value}" + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); //string result = Encoding.ASCII.GetString(returnData); } /// /// 写入振动单个参数 /// /// /// /// public void SetShakeParameters(int selectedShakeMotion, int id, string value) { var commandId = 300 + selectedShakeMotion * 17 + id; var command = "{WP" + $"{commandId}={value}" + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); } /// /// 写入平台振动完成参数 /// /// /// /// public async Task SetShakeParametersAsync(int selectedShakeMotion, string value) { if (selectedShakeMotion < 0 || selectedShakeMotion > 15) selectedShakeMotion = 0; char chn = (char)('A' + selectedShakeMotion); var command = "{SC" + $"{chn}=" + $"({value})" + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); } /// /// 写入平台振动完成参数 /// /// /// public void SetShakeParameters(int selectedShakeMotion, string value) { if (selectedShakeMotion < 0 || selectedShakeMotion > 15) selectedShakeMotion = 0; char chn = (char)('A' + selectedShakeMotion); var command = "{SC" + $"{chn}=" + $"({value})" + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); } /// /// 写入完整的平台振动参数 /// /// /// public void SetShakeParameters(int selectedShakeMotion, SingleActionParam value) { StringBuilder sb = new StringBuilder(); sb.Append($"{value.Motor1.Amplitude};{value.Motor1.Frequency};{value.Motor1.Phase};{(int)value.Motor1.WaveShape};"); sb.Append($"{value.Motor2.Amplitude};{value.Motor2.Frequency};{value.Motor2.Phase};{(int)value.Motor2.WaveShape};"); sb.Append($"{value.Motor3.Amplitude};{value.Motor3.Frequency};{value.Motor3.Phase};{(int)value.Motor3.WaveShape};"); sb.Append($"{value.Motor4.Amplitude};{value.Motor4.Frequency};{value.Motor4.Phase};{(int)value.Motor4.WaveShape};"); sb.Append($"{value.DurationValue}"); SetShakeParameters(selectedShakeMotion, sb.ToString()); } /// /// 写入完整的平台振动参数 /// /// /// /// public async Task SetShakeParametersAsync(int selectedShakeMotion, SingleActionParam value) { StringBuilder sb = new StringBuilder(); sb.Append($"{value.Motor1.Amplitude};{value.Motor1.Frequency};{value.Motor1.Phase};{(int)value.Motor1.WaveShape};"); sb.Append($"{value.Motor2.Amplitude};{value.Motor2.Frequency};{value.Motor2.Phase};{(int)value.Motor2.WaveShape};"); sb.Append($"{value.Motor3.Amplitude};{value.Motor3.Frequency};{value.Motor3.Phase};{(int)value.Motor3.WaveShape};"); sb.Append($"{value.Motor4.Amplitude};{value.Motor4.Frequency};{value.Motor4.Phase};{(int)value.Motor4.WaveShape};"); sb.Append($"{value.DurationValue}"); await SetShakeParametersAsync(selectedShakeMotion, sb.ToString()); } /// /// 获取完整的平台振动参数 /// /// /// public SingleActionParam GetShakeParameters(int selectedShakeMotion) { if (selectedShakeMotion < 0 || selectedShakeMotion > 15) selectedShakeMotion = 0; char chn = (char)('A' + selectedShakeMotion); var command = "{LC" + $"{chn}" + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace($"LC{chn}", "").Replace("(", "").Replace(")", "").Replace(":", "").Split(";"); int i = 0; SingleActionParam actionParam = new SingleActionParam(); actionParam.Motor1 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; i = 4; actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; i = 8; actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; i = 12; actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; actionParam.DurationValue = int.Parse(timeSpan[16]); return actionParam; } /// /// 获取完整的平台振动参数 /// /// /// public async Task GetShakeParametersAsync(int selectedShakeMotion) { if (selectedShakeMotion < 0 || selectedShakeMotion > 15) selectedShakeMotion = 0; char chn = (char)('A' + selectedShakeMotion); var command = "{LC" + $"{chn}" + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace($"LC{chn}", "").Replace("(", "").Replace(")", "").Replace(":", "").Split(";"); int i = 0; SingleActionParam actionParam = new SingleActionParam(); actionParam.Motor1 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; i = 4; actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; i = 8; actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; i = 12; actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) }; actionParam.DurationValue = int.Parse(timeSpan[16]); return actionParam; } /// /// 获取平台震动超时时间 /// /// public async Task GetPlatShakeTimeoutAsync() { const string sendCommand = "{RP65?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } /// /// 设置平台震动超时时间 /// /// /// public async Task SetPlatShakeTimeoutAsync(ushort upperFeederShakeTimeout) { const int commandId = 65; var command = "{WP" + $"{commandId}={upperFeederShakeTimeout}" + "}"; var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); //const string saveCommand = "{DG}"; //var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand)); } #endregion #region 料斗振动输出参数 //742~949 //742+8*n n 料斗动作 n 数字量输出 1 //743+8*n n 料斗动作 n 模拟量输出 1 //744+8*n n 料斗动作 n 数字量输出 2 //745+8*n n 料斗动作 n 模拟量输出 2 //746+8*n n 备用 //747+8*n n 备用 //748+8*n n 备用 //749+8*n n 料斗振动 n 持续时间 /// /// 执行料斗供料 /// /// public async Task ShakeUpAsync() { const string sendCommand = "{EF:(A;55;110)}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return ushort.Parse(result.TrimEnd().Split(';')[1].Replace("}", "").Replace(")", "")); } /// /// 执行供料 /// /// public int ShakeUp() { const string sendCommand = "{EF:(A;55;110)}"; var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand))); return ushort.Parse(result.TrimEnd().Split(';')[1].Replace("}", "").Replace(")", "")); } /// /// 停止料斗振动 /// /// public Task StopOutputAsync() { const string command = "{HB}"; return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); } /// /// 停止料斗振动 /// public void StopOutput() { const string command = "{HB}"; WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); } /// /// 获取料斗参数 /// /// /// public async Task GetUpperParamAsync(int selectedSequence) { var param = new HopperFeederParam(); var startIndex = 742 + selectedSequence * 8; var collections = new string[8]; for (var i = 0; i < 8; i++) { var id = startIndex + i; var result = await GetSingleParamValueAsync(id); collections[i] = result.Replace("{", "").Replace("}", "").Split(':')[1]; } param.HopperDigitalOutput1 = int.Parse(collections[0]) == 1; param.HopperAnalogOutput1 = int.Parse(collections[1]); param.HopperDigitalOutput2 = int.Parse(collections[2]) == 1; param.HopperAnalogOutput2 = int.Parse(collections[3]); param.HopperVibrationAmpl = int.Parse(collections[4]); param.HopperVibrationFreq = int.Parse(collections[5]); param.HopperVibrationWaveform = int.Parse(collections[6]); param.HopperDuration = int.Parse(collections[7]); return param; //return ushort.Parse(result.Split(':')[1].Replace("}", "")); } /// /// 写入输出参数 /// /// /// /// public async Task WriteOutputParamAsync(int groupId, HopperFeederParam param) { const int startId = 742; var id1 = startId + groupId * 8; var id2 = startId + groupId * 8 + 1; var id3 = startId + groupId * 8 + 2; var id4 = startId + groupId * 8 + 3; var id5 = startId + groupId * 8 + 7; var command1 = "{WP" + $"{id1}={Convert.ToInt32(param.HopperDigitalOutput1)}" + "}"; var command2 = "{WP" + $"{id2}={Convert.ToInt32(param.HopperAnalogOutput1)}" + "}"; var command3 = "{WP" + $"{id3}={Convert.ToInt32(param.HopperDigitalOutput2)}" + "}"; var command4 = "{WP" + $"{id4}={Convert.ToInt32(param.HopperAnalogOutput2)}" + "}"; var command5 = "{WP" + $"{id5}={Convert.ToInt32(param.HopperDuration)}" + "}"; var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command1)); var result2 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command2)); var result3 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command3)); var result4 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command4)); var result5 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command5)); await SaveShakeSetAsync(); } /// /// 获取料斗震动超时时间 /// /// public async Task GetUpperFeederShakeTimeoutAsync() { const string sendCommand = "{RP66?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } /// /// 设置料斗震动超时时间 /// /// /// public async Task SetUpperFeederShakeTimeoutAsync(ushort upperFeederShakeTimeout) { const int commandId = 66; var command = "{WP" + $"{commandId}={upperFeederShakeTimeout}" + "}"; var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); //const string saveCommand = "{DG}"; //var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand)); } /// /// 执行料斗动作 /// /// /// /// /// public async Task OutputAsync(int id, int? timespan = null) { if (id < 1 || id > 26) { throw new Exception("输入参数不正确"); } var enumerable = Enumerable.Range('A', 26).ToArray(); //var split = new[] { "A", "B" }; var outPut = "B" + (char)enumerable[id - 1]; var command = "{" + outPut + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace(outPut, ""); return string.IsNullOrWhiteSpace(timeSpan) ? 0 : int.Parse(timeSpan); } /// /// 执行料斗动作 /// /// /// /// public int Output(int id, int? timespan = null) { var enumerable = Enumerable.Range('A', 26).ToArray(); //var split = new[] { "A", "B" }; var outPut = "B" + (char)enumerable[id - 1]; var command = "{" + outPut + timespan + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace(outPut, ""); return int.Parse(timeSpan); } /// /// 获取取料斗动作状态 /// /// public bool GetOutputStatus() { const string sendCommand = "{RP97?}"; var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand))); return result.Split(':')[1].Replace("}", "") == "0" ? false : true; } /// ///获取取料斗动作状态 /// /// public async Task GetOutputStatusAsync() { const string sendCommand = "{RP97?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return result.Split(':')[1].Replace("}", "") == "0" ? false : true; } #endregion #region 序列动作参数 //950~1703 //950+29*n n 动作 1 类型 //951+29*n n 动作 1 震动 //952+29*n n 动作 1 持续模式 //953+29*n n 动作 1 持续时间值 //954+29*n n 动作 2 类型 //955+29*n n 动作 2 震动 //956+29*n n 动作 2 持续模式 //957+29*n n 动作 2 持续时间值 //958+29*n n 动作 3 类型 //959+29*n n 动作 3 震动 //960+29*n n 动作 3 持续模式 //961+29*n n 动作 3 持续时间值 //962+29*n n 动作 4 类型 //963+29*n n 动作 4 震动 //964+29*n n 动作 4 持续模式 //965+29*n n 动作 4 持续时间值 //966+29*n n 动作 5 类型 //967+29*n n 动作 5 震动 //968+29*n n 动作 5 持续模式 //969+29*n n 动作 5 持续时间值 //970+29*n n 动作 6 类型 //971+29*n n 动作 6 震动 //972+29*n n 动作 6 持续模式 //973+29*n n 动作 6 持续时间值 //974+29*n n 动作 7 类型 //975+29*n n 动作 7 震动 //976+29*n n 动作 7 持续模式 //977+29*n n 动作 7 持续时间值 //978+29*n n 震动平台零件极限值 /// /// 停止序列 /// /// public async Task StopOneSequenceAsync() { var sendCommand = "{HS}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); //string result = Encoding.ASCII.GetString(returnData); } /// /// 执行一个序列 /// /// /// public async Task StartOneSequenceAsync(int id) { var sendCommand = "{ES:(0;0;0;0;" + id + ")}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); var replaced = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("(", "").Replace(")", ""); var splits = replaced.Split(';'); return int.Parse(splits[5]); //#if NETCOREAPP // var time = int.Parse(splits[^1]); // return time; //#elif NET472||NETSTANDARD // var time = int.Parse(splits[splits.Length - 1]); // return time; //#endif } /// /// 获取单个序列集 /// /// /// public async Task GetSequenceGroupAsync(int id) { const int startId = SequenceParamStartAddress; var singleSequenceActionGroup = new SingleSequenceActionGroup(); singleSequenceActionGroup.SingleSequenceActions = new System.Collections.ObjectModel.ObservableCollection(); for (var i = 0; i < 7; i++) { var singleSequenceAction = new SingleSequenceAction(); var value1 = await GetSingleParamValueAsync(startId + id * 29 + i * 4); var value2 = await GetSingleParamValueAsync(startId + id * 29 + i * 4 + 1); var value3 = await GetSingleParamValueAsync(startId + id * 29 + i * 4 + 2); var value4 = await GetSingleParamValueAsync(startId + id * 29 + i * 4 + 3); value1 = value1.Replace("{", ""); value1 = value1.Replace("}", "").Split(':')[1]; value2 = value2.Replace("{", ""); value2 = value2.Replace("}", "").Split(':')[1]; value3 = value3.Replace("{", ""); value3 = value3.Replace("}", "").Split(':')[1]; value4 = value4.Replace("{", ""); value4 = value4.Replace("}", "").Split(':')[1]; singleSequenceAction.Type = (ActionType)int.Parse(value1); singleSequenceAction.ShakeId = int.Parse(value2) > 0 ? int.Parse(value2) : 0; singleSequenceAction.DurationMode = (DurationMode)int.Parse(value3); singleSequenceAction.DurationValue = int.Parse(value4); singleSequenceActionGroup.SingleSequenceActions.Add(singleSequenceAction); } var value5 = await GetSingleParamValueAsync(startId + id * 29 + 28); value5 = value5.Replace("{", ""); value5 = value5.Replace("}", "").Split(':')[1]; singleSequenceActionGroup.PartCntMax = int.Parse(value5); return singleSequenceActionGroup; } /// /// 写入序列参数 /// /// /// public void SetSequence(int groupId, int actionId, SingleSequenceAction singleSequenceAction) { const int startId = SequenceParamStartAddress; var id1 = startId + groupId * 29 + actionId * 4; var id2 = startId + groupId * 29 + actionId * 4 + 1; var id3 = startId + groupId * 29 + actionId * 4 + 2; var id4 = startId + groupId * 29 + actionId * 4 + 3; var command1 = "{WP" + $"{id1}={(int)singleSequenceAction.Type}" + "}"; var command2 = "{WP" + $"{id1}={singleSequenceAction.ShakeId}" + "}"; var command3 = "{WP" + $"{id1}={(int)singleSequenceAction.DurationMode}" + "}"; var command4 = "{WP" + $"{id1}={(int)singleSequenceAction.DurationValue}" + "}"; var result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command1)); result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command2)); result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command3)); result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command4)); } /// /// 写入序列参数 /// /// /// /// /// public async Task SetSequenceAsync(int groupId, int actionId, SingleSequenceAction singleSequenceAction) { const int startId = 950; var id1 = startId + groupId * 29 + actionId * 4; var id2 = startId + groupId * 29 + actionId * 4 + 1; var id3 = startId + groupId * 29 + actionId * 4 + 2; var id4 = startId + groupId * 29 + actionId * 4 + 3; var command1 = "{WP" + $"{id1}={(int)singleSequenceAction.Type}" + "}"; var command2 = "{WP" + $"{id2}={singleSequenceAction.ShakeId}" + "}"; var command3 = "{WP" + $"{id3}={(int)singleSequenceAction.DurationMode}" + "}"; var command4 = "{WP" + $"{id4}={singleSequenceAction.DurationValue}" + "}"; var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command1)); result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command2)); result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command3)); result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command4)); } /// /// 将序列参数存储至非易失内存中 /// /// /// public async Task SaveSequenceAsync() { const string sendCommand = "{DS}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); if (result.TrimEnd() != sendCommand.TrimEnd()) { throw new Exception("FFFeeder响应不正确"); } } /// /// 查询当前选择的序列 /// /// public int GetSelectedSequence() { const string sendCommand = "{US?}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } /// /// 查询当前选择的序列 /// /// public async Task GetSelectedSequenceAsync() { const string sendCommand = "{US?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } #endregion #region 背光灯操作 /// /// 背光灯打开 /// public void OpenLight() { WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(LightOpenCommand), MillisecondsTimeout); } /// /// 背光灯打开 /// /// public Task OpenLightAsync() { return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(LightOpenCommand), MillisecondsTimeout); } /// /// 背光关闭 /// public void CloseLight() { WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(LightCloseCommand), MillisecondsTimeout); } /// /// 背光关闭 /// /// public Task CloseLightAsync() { return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(LightCloseCommand), MillisecondsTimeout); } /// /// 设置背光打开超时时间 /// /// public void SetLightTimeOut(ushort timeout) { var commandId = 44; var command = "{WP" + $"{commandId}={timeout}" + "}"; var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command))); //var saveCommand = "{DG}"; //var result1 = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(saveCommand))); } /// /// 设置背光打开超时时间 /// /// /// public async Task SetLightTimeOutAsync(ushort timeout) { var commandId = 44; var command = "{WP" + $"{commandId}={timeout}" + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); //var saveCommand = "{DG}"; //returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand)); } /// /// 获取背光打开超时时间 /// /// public ushort GetLightTimeout() { const string sendCommand = "{RP44?}"; var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand))); return ushort.Parse(result.Split(':')[1].Replace("}", "")); } /// /// 获取背光打开超时时间 /// /// public async Task GetLightTimeoutAsync() { const string sendCommand = "{RP44?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } /// /// 设置背光亮度 /// /// /// public async Task SetLightValueAsync(ushort lightValue) { const int commandId = 34; var command = "{WP" + $"{commandId}={lightValue}" + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); //const string saveCommand = "{DG}"; //returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand)); //result = Encoding.ASCII.GetString(returnData); } /// /// 设置背光亮度 /// /// /// public async Task SetLightValueToBufferAsync(ushort lightValue) { const int commandId = 34; var command = "{WP" + $"{commandId}={lightValue}" + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); //string result = Encoding.ASCII.GetString(returnData); } /// /// 设置背光闪烁时间 /// /// /// public async Task SetBackLightFlashTimeAsync(ushort backLightFlash) { const int commandId = 33; var command = "{WP" + $"{commandId}={backLightFlash}" + "}"; var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); //const string saveCommand = "{DG}"; //var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand)); } /// /// 获取背光状态 /// /// /// public bool QueryLightState() { var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(QueryLightStateCommand)); string result = Encoding.ASCII.GetString(returnData); result = result.Trim().Replace("{", "").Replace("}", ""); var splitsStrings = result.Split(':'); if (splitsStrings.Length <= 1) { throw new Exception("RECEIVED DATA NOT CORRECT"); } return splitsStrings[1] == "1"; } /// /// 获取背光状态 /// /// /// public async Task QueryLightStateAsync() { var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(QueryLightStateCommand)); string result = Encoding.ASCII.GetString(returnData); result = result.Trim().Replace("{", "").Replace("}", ""); var splitsStrings = result.Split(':'); if (splitsStrings.Length <= 1) { throw new Exception("RECEIVED DATA NOT CORRECT"); } return splitsStrings[1] == "1"; } /// /// 获取背光亮度 /// /// public async Task GetLightBrightnessAsync() { const string sendCommand = "{RP34?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } /// /// 获取背光闪烁时间 /// /// public async Task GetBackLightFlashTimeAsync() { const string sendCommand = "{RP33?}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", "")); } #endregion /// /// 执行命令 /// /// /// /// public async Task RunFromCommand(string command, int? timespan = null) { var exeCommand = "{" + command + timespan + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(exeCommand)); string result = Encoding.ASCII.GetString(returnData); var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace(command, ""); return string.IsNullOrEmpty(timeSpan) ? 0 : int.Parse(timeSpan); } /// /// 读单个参数值 /// /// /// public string GetSingleParamValue(int id) { var command = "{RP" + id + "}"; var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); return result; } /// /// 读单个参数值 /// /// /// public async Task GetSingleParamValueAsync(int id) { var command = "{RP" + id + "}"; var returnData =await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); return result.TrimEnd(); } /// /// 设置IP地址 /// /// /// /// /// public async Task SetIpAddressAsync(string ip, string subNetMask, int port) { var ipSplits = ip.Split('.'); var subNetMaskSplits = subNetMask.Split('.'); var list = ipSplits.ToList(); list.AddRange(subNetMaskSplits); list.Add(port.ToString()); var commandId = 13; foreach (var command in list.Select(item => "{WP" + $"{commandId}={item}" + "}")) { var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); string result = Encoding.ASCII.GetString(returnData); commandId++; } string saveCommand = "{DF}"; var returnData1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand)); string result1 = Encoding.ASCII.GetString(returnData1); saveCommand = "{DG}"; returnData1 = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(saveCommand)); result1 = Encoding.ASCII.GetString(returnData1); } /// /// 设置IP地址 /// /// /// /// public void SetIpAddress(string ip, string subNetMask, int port) { var ipSplits = ip.Split('.'); var subNetMaskSplits = subNetMask.Split('.'); var list = ipSplits.ToList(); list.AddRange(subNetMaskSplits); list.Add(port.ToString()); var commandId = 13; foreach (var result in list.Select(item => "{WP" + $"{commandId}={item}" + "}") .Select(command => Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command))))) { commandId++; } const string saveCommand = "{DG}"; var result1 = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(saveCommand)); } /// /// 获取输入触发参数 /// /// /// /// public async Task GetInputTrigger(int i) { if (i > 2 || i < 0) { throw new IndexOutOfRangeException("输入的参数id{i}超出了索引"); } var param = await GetSingleParamValueAsync(40 + i - 1); var value1 = param.Replace("{", ""); value1 = value1.Replace("}", "").Split(':')[1]; return int.Parse(value1); } /// /// 设置输入触发参数 /// /// /// /// /// public async Task SetInputTrigger(int id, int value) { if (id > 2 || id < 0) { throw new IndexOutOfRangeException("输入的参数id{i}超出了索引"); } var commandId = 39 + id; var command = "{WP" + $"{commandId}={value}" + "}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command)); //const string saveCommand = "{DG}"; //returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand)); } /// /// 将所有参数存储至非易失内存中 /// /// /// public async Task SaveAllSetAsync() { string sendCommand = "{DF}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); if (result.TrimEnd() != sendCommand.TrimEnd()) { throw new Exception("FFFeeder响应不正确"); } } /// /// 将全局参数存储至非易失内存中 /// /// /// public async Task SaveGlobalSetAsync() { string sendCommand = "{DG}"; var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand)); string result = Encoding.ASCII.GetString(returnData); if (result.TrimEnd() != sendCommand.TrimEnd()) { throw new Exception("FFFeeder响应不正确"); } } #endregion /// /// 断开连接,释放资源 /// public void Dispose() { TcpClient.Close(); TcpClient.Dispose(); } /// /// 成功连接到服务器 /// /// /// /// private Task ConnectedVoid(ITcpClient client, ConnectedEventArgs e) { FeederConnectionStatusChanged?.Invoke(this,true); FeederModel = GetFeederModel(); //Console.WriteLine($"{client.RemoteIPHost.EndPoint.ToString()}已连接!"); return EasyTask.CompletedTask; } /// /// 从服务器断开连接,当连接不成功时不会触发。 /// /// /// /// private Task DisconnectedVoid(ITcpClient client, ClosedEventArgs e) { FeederConnectionStatusChanged?.Invoke(this,false); //Console.WriteLine($"{client.IP}断开连接!"); return EasyTask.CompletedTask; } /// /// 获取Feeder型号 /// /// public FeederModel GetFeederModel() { try { string res = GetSingleParamValue(30).Replace("{", "").Replace("}", "").Split(':')[1]; if (int.TryParse(res,out int model)) { switch (model) { case 120: return FeederModel.FF120; case 240: return FeederModel.FF240; case 380: return FeederModel.FF380; case 530: return FeederModel.FF530; default: return FeederModel.Unknown; } } else { return FeederModel.Unknown; } } catch (Exception) { return FeederModel.Unknown; } } /// /// 获取Feeder型号 /// /// public async Task GetFeederModelAsync() { try { string res =await GetSingleParamValueAsync(30); if (int.TryParse(res, out int model)) { switch (model) { case 120: return FeederModel.FF120; case 240: return FeederModel.FF240; case 380: return FeederModel.FF380; case 530: return FeederModel.FF530; default: return FeederModel.Unknown; } } else { return FeederModel.Unknown; } } catch (Exception) { return FeederModel.Unknown; } } } }