/// <summary> /// 切换连续速度地址的电机速度 /// </summary> /// <param name="Motors"></param> /// <param name="speed"></param> /// <returns></returns> public static bool SwitchSpeed(AbstractComm Comm, Electromotor[] Motors, int speed) { var result = true; var len = Motors.Length; byte[] dis = new byte[4 * len]; for (byte b = 0; b < len; b++) { var bval = ByteUtil.Int4ToBytes(speed); Array.Copy(bval, 0, dis, 4 * b, 4); } result = result && Comm.SetBatchRegister(Comm.ConvertFatekAddrToModbusAddr(Motors[0].Speed.Addr.Substring(1)), (short)(len * 2), dis); return(result); }
/// <summary> /// 启动连续地址电机,如加样器Y轴,距离地址连续,启动地址连续,反馈信号地址连续 /// </summary> /// <param name="motors"></param> /// <param name="Distances">为负值时,不会应用校正因子</param> /// <param name="gap"></param> /// <param name="Comm"></param> /// <returns></returns> public static bool MoveMotors(Electromotor[] motors, decimal[] Distances, decimal[] gap, AbstractComm Comm, bool OnlyStart, bool PauseScan = true, bool IsInjectorY = false, bool IsInitInjectorY = false) { Constants.PauseResetEvent.WaitOne(); if (Constants.UserAbort) { return(false); } var len = motors.Length; byte[] dis = new byte[len * 4]; for (byte b = 0; b < len; b++) { var realdis = motors[b].GetRealDistance(Distances[b], gap == null?0m:gap[b]); if (motors[b].CurrentDistance == realdis) { return(true); } else { motors[b].CurrentDistance = realdis < 0?0: realdis; Distances[b] = realdis; var val = Convert.ToInt32(realdis < 0? realdis:(realdis * Convert.ToDecimal(motors[b].Factor.SetValue))); var bval = ByteUtil.Int4ToBytes(val); Array.Copy(bval, 0, dis, 4 * b, 4); } } var result = true; if (PauseScan) { Comm.ScanRestEvent.Reset(); } //关闭完成信号 result = result && Comm.SetBatchCoil(motors[0].DoneCoil.Addr, (short)len, 0x00); result = result && Comm.SetBatchRegister(Comm.ConvertFatekAddrToModbusAddr(motors[0].Distance.Addr.Substring(1)), (short)(len * 2), dis); if (IsInjectorY) { result = result && Comm.SetCoilOn("M99"); if (IsInitInjectorY) { for (byte b = 0; b < Distances.Length; b++) { if (Distances[b] == 0) { Comm.SetCoilOn(motors[b].DoneCoil.Addr);//开启反馈信号 } } } } else { result = result && StartMotor(motors, Comm, true, false); } if (PauseScan) { Comm.ScanRestEvent.Set(); } if (!OnlyStart) { result = result && Comm.Doned(30000, true, motors.Select(item => item.DoneCoil.Addr).ToArray()); } return(result); }