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 { /// /// MotorZ通信 /// public class MotorZPort : SerialPortImp, PortControlImp { private static readonly ILogger logger = LogFactory.BuildLogger(typeof(MotorZPort)); /// /// Z轴 /// /// 日志 /// 配置 public MotorZPort( ReadConfigUtil config) : base( config) { config.GetSpeed.ForEach(item => { if (item.NodeName == "MotorZ") speedZ = item.Speed; }); } private double speedZ = 0; public object Read(PortArgs args) { object res = args.ReadWay switch { "OriginalPosition" => GetOriginalPosition(args), _ => JudgeStorage(args.NodeId), }; return res; } public object GetOriginalPosition(PortArgs args) { var res = JudgeStorage(args.NodeId); if (res is null or { Length: 0 }) return false; return res[2].Equals('0'); } public bool Write(PortArgs args) { //var portArgs = new PortArgs //{ // TypeName = "Mani", // NodeId = 3, // ReadWay = "Judge" //}; long distance = args.Distance; //var resbool = GetJudge(portArgs); //if (resbool) //{ // distance /= 2;//通过判断抓手状态决定Z轴运行距离 //} var res = args.WriteWay switch { WriteWay.Move => zmove(args), WriteWay.GoBack => MotorGoBack(args.NodeId, 3), 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; } private bool zmove(PortArgs args) { string res1 = ""; while (res1 != "0009\r" && res1 != "0209\r") { var storageRes = JudgeXYZMove(1);//Z轴动之前x轴要静止 if (storageRes.Equals("")) return false; res1 = storageRes; Thread.Sleep(300); } res1 = ""; while (res1 != "0009\r" && res1 != "0209\r") { var storageRes = JudgeXYZMove(2);//Z轴动之前Y轴要静止 if (storageRes.Equals("")) return false; res1 = storageRes; Thread.Sleep(300); } return Move(args.NodeId, args.Distance, 50, speedZ); } } }