using System; using System.Threading; using SHJX.Service.Common.Extend; using SHJX.Service.Common.ReadXML; using SHJX.Service.Model.Control; using SHJX.Service.ServerClient.Interface; using SHJX.Service.ServerClient.TempController; using SHJX.Service.Common.Logging; using Microsoft.Extensions.Logging; namespace SHJX.Service.ServerClient.RS485Control { /// /// 消解位通信 /// public class DissolvePort : SerialPortImp, PortControlImp { private static readonly ILogger logger = LogFactory.BuildLogger(typeof(DissolvePort)); private readonly ReadConfigUtil _config; /// /// 消解位 /// /// 日志 /// 配置 public DissolvePort( ReadConfigUtil config) : base(config) { _config = config; config.GetSpeed.ForEach(item => { if (item.NodeName == "MotorD") speedD = item.Speed; }); } private double speedD = 0; public object Read(PortArgs args) { object obj = args.ReadWay switch { "OriginalPosition" => GetOriginalPosition(args), _ => JudgeStorage(args.NodeId), }; return obj; } public object GetOriginalPosition(PortArgs args) { var res = JudgeStorage(args.NodeId); if (res is null or { Length: 0 }) return false; return res[3].Equals('0'); } public bool Write(PortArgs args) { var res = args.WriteWay switch { WriteWay.Normotopia => MotorGoBack(args.NodeId, 3), WriteWay.Antiposition => MotorGoBackDissolvePortM(args), WriteWay.Move => Move(args.NodeId, args.Distance,speedD), WriteWay.Stop => MotorStop(args.NodeId), WriteWay.Speed => MotorSpeed(args.NodeId, args.Distance), WriteWay.AcSpeed => MotorAcSpeed(args.NodeId, args.Distance), WriteWay.DeSpeed => MotorDeSpeed(args.NodeId, args.Distance), _ => throw new ArgumentNullException(args.WriteWay.GetEnumDesc()) }; return res; } /// /// 移动 /// /// /// /// public bool Move(byte nodeId, long distance,Double Speed) { MotorMove(nodeId, distance); Thread.Sleep((int)(Math.Abs(distance) / 20000 * 300* Speed + 500)); return true; } private bool MotorGoBackDissolvePortM(PortArgs args) { if (args.ManualOrAuto=="Auto") { MotorMove(args.NodeId, -2000 * _config.DissolveMoveDistance); Thread.Sleep(800); MotorMove(args.NodeId, 2000 * _config.DissolveMoveDistance); Thread.Sleep(800); MotorMove(args.NodeId, -2000 * _config.DissolveMoveDistance); Thread.Sleep(800); MotorMove(args.NodeId, 2000 * _config.DissolveMoveDistance); Thread.Sleep(800); MotorMove(args.NodeId, -2000 * _config.DissolveMoveDistance); Thread.Sleep(800); MotorMove(args.NodeId, 2000 * _config.DissolveMoveDistance); Thread.Sleep(Convert.ToInt32(_config.CoolingPipeWatingTime) * 15000); } MotorGoBackDissolvePort(args.NodeId, 4); //Thread.Sleep((int)(Math.Abs(distance) / 20000 * 300 * Speed + 500)); return true; } } }