Ejemplo n.º 1
0
        public static bool StopMotor(Electromotor[] Motors, AbstractComm Comm, bool IsContinuity, bool ForceStop)
        {
            if (!ForceStop && Motors.All(m => !m.IsStarted))
            {
                return(true);
            }
            var result = true;

            if (IsContinuity)
            {
                byte val = 0x00;
                for (int i = Motors.Length - 1; i >= 0; i--)
                {
                    Motors[i].IsStarted = false;
                }
                result = Comm.SetBatchCoil(Motors[0].StartCoil.Addr, (short)Motors.Length, val);
            }
            else
            {
                foreach (var Motor in Motors)
                {
                    result = result && StopMotor(Motor, Comm);
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        public static bool SwitchSpeed(AbstractComm Comm, DoubleSpeedMotor Motor, bool IsSencond)
        {
            var result = true;

            result = result && Comm.SetRegister(Motor.Speed.Addr, (IsSencond ? Motor.SecondSpeed : Motor.Speed).SetValue);
            return(result);
        }
Ejemplo n.º 3
0
        public static bool StartMotor(Electromotor Motor, AbstractComm Comm)
        {
            var result = Motor.IsStarted || Comm.SetCoilOn(Motor.StartCoil.Addr);

            Motor.IsStarted = result;
            return(result);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 初始化电机,先归零,再初始化
        /// </summary>
        /// <param name="Motor"></param>
        /// <param name="Comm"></param>
        /// <returns></returns>
        public static bool InitMotor(Electromotor Motor, AbstractComm Comm, bool OnlyStart = false, decimal gap = 0m)
        {
            Constants.UserAbort = false;
            //var result=MoveMotor(Motor, Comm, 0);
            var result = StopMotor(Motor, Comm, true);

            result = result && Comm.SetRegister(Motor.Distance.Addr, 0);
            result = result && Comm.SetCoilOff(Motor.InitCoil.Addr);
            result = result && Comm.SetCoilOn(Motor.InitCoil.Addr);
            Motor.CurrentDistance = 0m;
            Motor.IsBack          = true;
            Motor.IsStarted       = false;
            if (!OnlyStart)
            {
                result = result && Comm.Doned(30000, false, Motor.InitCoil);
                if (Motor.ProgramZero > 0)
                {
                    result = result && MoveMotor(Motor, Comm, 0, false, true, gap);
                }
            }
            else
            {
                if (Motor.ProgramZero > 0)
                {
                    Task.Run(() =>
                    {
                        MoveMotor(Motor, Comm, 0, false, true, gap);
                    });
                }
            }
            return(result);
        }
Ejemplo n.º 5
0
 public static void LoadMotor(Electromotor Motor, AbstractComm Comm)
 {
     LoadPLC <Boolean>(Motor.InitCoil, Comm);
     LoadPLC <Boolean>(Motor.StartCoil, Comm);
     LoadPLC <bool>(Motor.DoneCoil, Comm);
     LoadPLC <bool>(Motor.Zero, Comm);
     LoadPLC <float>(Motor.Distance, typeof(Int32), Motor.Factor.SetValue, Comm);
     //LoadPLC<float>(Motor.Factor, Comm);
     LoadPLC <float>(Motor.Maximum, Comm);
     LoadPLC <Int32>(Motor.Speed, Comm);
 }
Ejemplo n.º 6
0
        public static bool FindMachineZero(AbstractComm Comm, DoubleSpeedMotor[] Motors)
        {
            if (Motors == null || Motors.Length == 0)
            {
                return(false);
            }
            var result = SwitchSpeed(Comm, Motors, Motors[0].SecondSpeed.SetValue);

            result = result && MoveMotors(Motors, Motors.Select(m => - 100m).ToArray(), null, Comm, false);
            result = SwitchSpeed(Comm, Motors, Motors[0].Speed.SetValue);

            return(result);
        }
Ejemplo n.º 7
0
        /// <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);
        }
Ejemplo n.º 8
0
        public static bool StopMotor(Electromotor Motor, AbstractComm Comm, bool ForceStope = false)
        {
            var result = true;

            if (ForceStope)
            {
                result = result && Comm.SetCoilOff(Motor.StartCoil.Addr);
            }
            else
            {
                result = result && (!Motor.IsStarted || Comm.SetCoilOff(Motor.StartCoil.Addr));
            }

            Motor.IsStarted = false;
            return(result);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 移到指定位置,移动前关闭反馈完成信号
        /// </summary>
        /// <param name="Motor"></param>
        /// <param name="Comm"></param>
        /// <returns></returns>
        public static bool MoveMotor(Electromotor Motor, AbstractComm Comm, decimal?Distance, bool OnlyStart = false, bool Start = true, decimal gap = 0m)
        {
            Constants.PauseResetEvent.WaitOne();
            if (Constants.UserAbort)
            {
                return(false);
            }
            if (!Distance.HasValue)
            {
                return(false);
            }
            if (Distance.Value < 0)
            {
                Distance = 0;
            }
            var realdis = Motor.GetRealDistance(Distance.Value, gap);

            if (Motor.CurrentDistance == realdis)
            {
                return(true);
            }
            else
            {
                //关闭完成信号
                Comm.SetCoil(false, Motor.DoneCoil.Addr);
            }
            Motor.CurrentDistance = realdis;
            int distance = Convert.ToInt32(realdis * Convert.ToDecimal(Motor.Factor.SetValue));
            var result   = Comm.SetRegister(Motor.Distance.Addr, distance);

            if (Start)
            {
                StartMotor(Motor, Comm);
            }
            if (!OnlyStart)
            {
                result = Comm.Doned(30000, true, Motor.DoneCoil);
            }
            return(result);
        }
Ejemplo n.º 10
0
        public static void LoadPLC <T>(PLCParameter <T> pLCParameter, Type pclType, float factor, AbstractComm Comm)
        {
            if (String.IsNullOrEmpty(pLCParameter.Addr))
            {
                return;
            }
            String TypeName = pclType == null ? typeof(T).Name : pclType.Name;
            Object curVal   = null;

            switch (TypeName)
            {
            case "Boolean":
            {
                curVal = (Object)Comm.ReadCoil(1, pLCParameter.Addr)[0];
                break;
            }

            case "Single":
            {
                curVal = (Single)(Comm.ReadFloat(pLCParameter.Addr) / factor);
                break;
            }

            case "Int32":
            {
                curVal = (Comm.ReadInt32(pLCParameter.Addr) / factor);
                break;
            }

            case "Int16":
            {
                curVal = (Comm.ReadInt16(pLCParameter.Addr) / factor);
                break;
            }

            default:
            {
                break;
            }
            }
            switch (typeof(T).Name)
            {
            case "Boolean":
            case "Single":
            {
                pLCParameter.CurrentValue = (T)curVal;
                break;
            }

            case "Int32":
            {
                pLCParameter.CurrentValue = (T)(Object)Convert.ToInt32(curVal);
                break;
            }

            case "Int16":
            {
                pLCParameter.CurrentValue = (T)(Object)Convert.ToInt16(curVal);
                break;
            }

            default:
            {
                break;
            }
            }
        }
Ejemplo n.º 11
0
 public static void LoadPLC <T>(PLCParameter <T> pLCParameter, AbstractComm Comm)
 {
     LoadPLC <T>(pLCParameter, null, 1, Comm);
 }
Ejemplo n.º 12
0
        public bool ChangeSpeed(Electromotor motor, int speed, AbstractComm Comm)
        {
            var res = Comm.SetRegister(motor.Speed.Addr, speed);

            return(res);
        }
Ejemplo n.º 13
0
        /// <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);
        }
Ejemplo n.º 14
0
 public static void SetMotor(Electromotor Motor, AbstractComm Comm)
 {
     Set2PLC(Motor.Maximum, typeof(Int32), Motor.Factor.SetValue, Comm);
     Set2PLC(Motor.Speed, Comm);
 }
Ejemplo n.º 15
0
        public static void Set2PLC <T>(PLCParameter <T> pLCParameter, Type targetType, float factor, AbstractComm Comm)
        {
            if (String.IsNullOrEmpty(pLCParameter.Addr))
            {
                return;
            }
            String TypeName = targetType == null ? typeof(T).Name : targetType.Name;

            switch (TypeName)
            {
            case "Boolean":
            {
                Comm.SetCoil((bool)(Object)pLCParameter.SetValue, Comm.ConvertFatekAddrToModbusAddr(pLCParameter.Addr));
                break;
            }

            case "Single":
            {
                Comm.SetRegister(pLCParameter.Addr, (float)(Object)pLCParameter.SetValue * factor);
                break;
            }

            case "Int32":
            {
                Comm.SetRegister(pLCParameter.Addr, Convert.ToInt32(Convert.ToSingle((Object)pLCParameter.SetValue) * factor));
                break;
            }

            case "Int16":
            {
                var val = Convert.ToInt16(Convert.ToSingle((Object)pLCParameter.SetValue) * factor);
                //Console.WriteLine("val=" + val);
                Comm.SetRegister(pLCParameter.Addr, val);
                break;
            }

            default:
            {
                break;
            }
            }
        }
Ejemplo n.º 16
0
 public GelWarehouseDevice(AbstractCanComm CanComm, AbstractComm PcbComm, GelWarehouse GelWare)
 {
     this.CanComm = CanComm;
     this.GelWare = GelWare;
     this.PcbComm = PcbComm;
 }