AxisBean.cs 9.0 KB
using DeviceLib;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class AxisBean
    {
        public ConfigMoveAxis Config = null;
        public static int TimeoutInterval = 500;
        /// <summary>
        /// 正常工作过程中判断位置是否到达时使用
        /// </summary>
        public int LastPosition = 0;

        public string AxisName;
        public AxisBean(ConfigMoveAxis axisConfig, string deviceName)
        {
            this.Config = axisConfig;
            AxisName = deviceName + " " + Config.Explain + "[" + Config.DeviceName + "-" + Config.GetAxisValue() + "]";
        }


        private bool IsIntSlvBlock = false;
        public bool Open(bool isCheck, out string Msg)
        {
            IOManager.IOMove(Config.Axis_Run_DO,IO_VALUE.HIGH);
            Msg = "";
            string portName = Config.DeviceName;
            int slvAddr = Config.GetAxisValue();
            //打开 轴 
            int bro = ConfigAppSettings.GetIntValue(Setting_Init.ACBaudRate);
            ACServerManager.OpenPort(Config.DeviceName,bro);
            Thread.Sleep(50);
            //初始化
            if (!IsIntSlvBlock)
            {
                ACServerManager.InitSlvAddr(portName, slvAddr, Config.TargetSpeed, Config.AddSpeed, Config.DelSpeed);
                Thread.Sleep(100);
            }
            ACServerManager.AlarmClear(portName, slvAddr);
            Thread.Sleep(50);
            ACServerManager.ServoOn(portName, slvAddr);

            Thread.Sleep(1000);
            //打开所有轴
            if (isCheck)
            {
                if (!OpenAxis(out Msg))
                {
                    return false;
                }
            }
            IOManager.IOMove(Config.Axis_Brake_DO, IO_VALUE.HIGH);
            IsIntSlvBlock = true;
            return true;
        }
        /// <summary>
        /// 打开所有轴
        /// </summary>
        /// <returns></returns>
        private bool OpenAxis(out string msg)
        {
            msg = "";
            //判断轴是否正常
            string portName = Config.DeviceName;
            int slvAddr = Config.GetAxisValue();
            if (ACServerManager.ServerOnStatus(portName, slvAddr))
            {
                LogUtil.info(AxisName + "成功打开");
            }
            else
            {
                //清理报警,再重新打开一次
                LogUtil.info(AxisName + "第一次打开失败,先清理一下报警,再重新打开一次");
                ACServerManager.AlarmClear(portName, slvAddr);
                System.Threading.Thread.Sleep(1200);
                ACServerManager.ServoOn(portName, slvAddr);
                System.Threading.Thread.Sleep(100);
                if (ACServerManager.ServerOnStatus(portName, slvAddr))
                {
                    LogUtil.info(AxisName + "清理报警后重新打卡轴成功:" + Config.Explain);
                }
                else
                {
                    ACServerManager.ServoOff(portName, slvAddr);
                    msg = "打开轴" + Config.Explain + "失败 ";
                    LogUtil.info(AxisName + msg);
                    return false;
                }
            }

            return true;
        }
        public void ServoOff()
        {
            LogUtil.info("ServoOff【" + AxisName + "】");
            IOManager.IOMove(Config.Axis_Brake_DO, IO_VALUE.LOW);
            ACServerManager.ServoOff(Config.DeviceName, Config.GetAxisValue()); 
            IOManager.IOMove(Config.Axis_Run_DO, IO_VALUE.LOW);
        }
        public void HomeMove(StoreMoveInfo MoveInfo)
        {
            Config.TargetPosition = 0;
            LogUtil.info(AxisName + "speed[" + Config.TargetSpeed + "]开始原点返回");
            MoveInfo.WaitList.Add(WaitResultInfo.WaitAxis(Config, true));
            ACServerManager.HomeMove(Config.DeviceName, (short)Config.GetAxisValue(), Config.HomeHighSpeed);
        }
         
        public void AbsMove(StoreMoveInfo MoveInfo, int targetPosition, int targetSpeed)
        {
            if (MoveInfo == null)
            {
                AbsMove(targetPosition, targetSpeed);
            }
            else
            {
                MoveInfo.WaitList.Add(WaitResultInfo.WaitAxis(Config, targetPosition, targetSpeed));
                Config.TargetPosition = targetPosition;
                ACServerManager.AbsMove(Config.DeviceName, Config.GetAxisValue(), targetPosition, targetSpeed);
            }
        }
         
        public static bool ACAxisMoveIsEnd(StoreMoveInfo MoveInfo, ConfigMoveAxis axis, int targetPosition, int targetSpeed, out string msg)
        {
            msg = "";
            string deviceName = axis.DeviceName;
            short axisNo = axis.GetAxisValue();

            bool isOk = ACServerManager.GetBusyStatus(deviceName, axisNo).Equals(0);
            int outCount = ACServerManager.GetActualtPosition(deviceName, axisNo);
            int errorCount = Math.Abs(outCount - targetPosition);
            if (isOk)
            {
                if (errorCount <= axis.CanErrorCountMax)
                {
                    return true;
                }
                //判断是否需要重新运动
                if (MoveInfo.CanWhileCount > 0)
                {
                    LogUtil.error(MoveInfo.Name + axis.DisplayStr + "目标位置[" + targetPosition + "]当前位置[" + outCount +
                     "],误差过大,重新开始运动,剩余[" + MoveInfo.CanWhileCount + "]次");
                    ACServerManager.SuddenStop(axis.DeviceName, axis.GetAxisValue());
                    ACServerManager.AbsMove(axis.DeviceName, axis.GetAxisValue(), targetPosition, targetSpeed);
                    MoveInfo.CanWhileCount--;
                }
                else
                {
                    msg = " " + MoveInfo.MoveStep + MoveInfo.Name + axis.DisplayStr + ",目标位置[" + targetPosition + "]当前位置[" + outCount
                        + "],误差过大,需要报警";
                    LogUtil.error(msg, 600);
                }
            }
            return false;
        }
        public static bool HomeMoveIsEnd(StoreMoveInfo MoveInfo, ConfigMoveAxis axis, out string msg)
        {
            msg = "";
            if (ACServerManager.IsHomeMoveEnd(axis.DeviceName, axis.GetAxisValue()))
            {
                //原点完成并且位置=0
                int outCount = ACServerManager.GetActualtPosition(axis.DeviceName, axis.GetAxisValue());
                int errorCount = Math.Abs(outCount);
                if (errorCount <= axis.CanErrorCountMax)
                {
                    return true;
                }
                //判断是否需要重新运动
                if (MoveInfo.CanWhileCount > 0)
                {
                    LogUtil.error(MoveInfo.Name + axis.DisplayStr + "收到原点完成信号,当前位置[" + outCount + "],重新回原点,剩余[" + MoveInfo.CanWhileCount + "]次");
                    //LogUtil.error( StoreName +  moveAxis.DisplayStr +  "重新回原点"); 
                    ACServerManager.HomeMove(axis.DeviceName, axis.GetAxisValue(), axis.HomeHighSpeed,true);
                    MoveInfo.CanWhileCount--;
                }
                else
                {
                    msg =MoveInfo.Name+ " " + MoveInfo.MoveType + axis.DisplayStr + ",收到原点完成信号,当前位置[" + outCount + "],误差过大,需要报警";
                    LogUtil.error(msg);
                }
            }
            return false;
        }

        public int GetAclPosition()
        {
            int p = ACServerManager.GetActualtPosition(Config.DeviceName,Config.GetAxisValue());
            return p;
        }
        public bool IsInPosition(int targetP)
        {
            int currp = GetAclPosition();

            int chaz = targetP - currp;
            if (Math.Abs(chaz) < Config.CanErrorCountMax)
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 绝对运动至点,不等待结果
        /// </summary> 
        private void AbsMove(int targetPos, double targetSpeed)
        {
            if (targetPos.Equals(-1))
            {
                return;
            }
            LastPosition = -1;
            if (targetSpeed > Config.TargetSpeed || targetSpeed <= 0)
            {
                targetSpeed = Config.TargetSpeed;
            }
            //小于1,表示是目标速度的百分比
            else if (targetSpeed <= 1)
            {
                targetSpeed = Config.TargetSpeed * targetSpeed;
            }
            ACServerManager.AbsMove(Config.DeviceName, Config.GetAxisValue(), targetPos, (int)targetSpeed);

        }
        public void SuddenStop()
        {
            ACServerManager.SuddenStop(Config.DeviceName, Config.GetAxisValue());
        }

    }
}