AxisMoveControl.cs 15.2 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OnlineStore.DeviceLibrary;
using OnlineStore.Common;
using System.Threading;
using OnlineStore.LoadCSVLibrary;
using HuichuanLibrary;
using System.Net.Sockets;

namespace OnlineStore.XLRStore
{
    public partial class AxisMoveControl : UserControl
    {
        private List<AxisBean> axisList = new List<AxisBean>();
        private EquipBase equipBase = null;
        private string PortName = "";
        private short SlvAddr = 0;
        private bool IsHuiChuan = true;
        private Color btnBackColor = Color.White;
        public AxisMoveControl( )
        { 
            InitializeComponent(); 
        }
        public void LoadData(EquipBase equipBase, params AxisBean[] moveAxis)
        {
            this.equipBase = equipBase;
            axisList = new List<AxisBean>(moveAxis);

            if (axisList.Count > 0)
            { 
                cmbAxis.Items.Clear();
                foreach (AxisBean a in axisList)
                {
                    cmbAxis.Items.Add(a.Config.Explain);
                }
                cmbAxis.SelectedIndex = 0;

                PortName = moveAxis[0].Config.DeviceName;
                SlvAddr = moveAxis[0].Config.GetAxisValue();
                txtAxisDeviceName.Text = PortName;
                txtAxisValue.Text = SlvAddr.ToString();
            }
            btnAddMove.BackColor = Color.White;
            btnDelMove.BackColor = Color.White;
            this.IsHuiChuan = AxisManager.instance is HCAxisManager;
            if (IsHuiChuan)
            { 
                groupBox2.Visible = true;
                timer1.Start();
            }
            else
            { 
                groupBox2.Visible = false;
            }
        }
        private void btnOpenAxis_Click(object sender, EventArgs e)
        { 
            LogUtil.info(equipBase.Name+ "界面点击【打开伺服】,【" + PortName + "_" + SlvAddr + "】 ");
            equipBase.RunAxis(false, axisList[cmbAxis.SelectedIndex]);
        }

        private void btnCloseAxis_Click(object sender, EventArgs e)
        {
            LogUtil.info(equipBase.Name + "界面点击【关闭伺服】,【" + PortName + "_" + SlvAddr + "】 ");
            //   AxisManager.instance.ServoOff(PortName, SlvAddr); 
            equipBase.CloseAxis(axisList[cmbAxis.SelectedIndex]);
        }

        private void btnAxisAMove_Click(object sender, EventArgs e)
        {
            int position = FormUtil.GetIntValue(txtAPosition);
            int speed = FormUtil.GetIntValue(txtASpeed);
            LogUtil.info(equipBase.Name + "界面点击【绝对运动】,【" + PortName + "_" + SlvAddr + "】位置【" + position + "】速度【" + speed + "】");
            AxisManager.instance.AbsMove(PortName, SlvAddr, position, speed, currSelAxis.AddSpeed, currSelAxis.DelSpeed);
        }

        private void btnAxisRMove_Click(object sender, EventArgs e)
        {
            int position = FormUtil.GetIntValue(txtAPosition);
            int speed = FormUtil.GetIntValue(txtASpeed);
            LogUtil.info(equipBase.Name + "界面点击【相对运动】,【" + PortName + "_" + SlvAddr + "】位置【" + position + "】速度【" + speed + "】");
            AxisManager.instance.RelMove(PortName, SlvAddr, position, speed, currSelAxis.AddSpeed, currSelAxis.DelSpeed);
        }

        private void btnAxisVMove_Click(object sender, EventArgs e)
        {
            int speed = FormUtil.GetIntValue(txtASpeed);
            LogUtil.info(equipBase.Name + "界面点击【匀速运动】,【" + PortName + "_" + SlvAddr + "】 速度【" + speed + "】");
            AxisManager.instance.SpeedMove(PortName, SlvAddr, speed);
         
        }
        private void btnAxisStop_Click(object sender, EventArgs e)
        {
            LogUtil.info(equipBase.Name + "界面点击【停止运动】,【" + PortName + "_" + SlvAddr + "】 ");
            AxisManager.instance.SuddenStop(PortName, SlvAddr);
            if (btnAddMove.BackColor == Color.Green)
            {
                btnAddMove.BackColor = btnBackColor;

            }
            if (btnDelMove.BackColor == Color.Green)
            {
                btnDelMove.BackColor = btnBackColor;
            }
            btnReadPosition_Click(null, null);
        }

        private void btnComAlarmClear_Click(object sender, EventArgs e)
        {
            LogUtil.info(equipBase.Name + "界面点击【清理报警】,【" + PortName + "_" + SlvAddr + "】 ");
            AxisManager.instance.AlarmClear(PortName, SlvAddr);
            Thread.Sleep(100);
            AxisManager.instance.ServoOn(PortName, SlvAddr);
        }

        private void btnAxisReturnHome_Click(object sender, EventArgs e)
        {
            if (currSelAxis != null)
            {
                //int speed = FormUtil.GetIntValue(txtASpeed);
                int speed = currSelAxis.HomeHighSpeed;
                LogUtil.info(equipBase.Name + "界面点击【原点返回】,【" + PortName + "_" + SlvAddr + "】 速度【" + speed + "】");
                AxisManager.instance.HomeMove(PortName, SlvAddr, speed,currSelAxis.HomeLowSpeed,currSelAxis.HomeAddSpeed);
            }
        }
         
        private void btnReadPosition_Click(object sender, EventArgs e)
        { 
            txtAxisPosition.Text = AxisManager.instance.GetActualtPosition(PortName, SlvAddr).ToString();
        }

        private ConfigMoveAxis currSelAxis = null;
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbAxis.SelectedIndex >= 0)
            {
                currSelAxis = axisList[cmbAxis.SelectedIndex].Config;
                PortName = currSelAxis.DeviceName;
                SlvAddr = currSelAxis.GetAxisValue();
                txtAxisDeviceName.Text = PortName;
                txtAxisValue.Text = SlvAddr.ToString();
                Color color = Color.Black;
                
                switch (cmbAxis.Items[cmbAxis.SelectedIndex].ToString())
                {
                    case "行走机构":
                        btnAddMove.Text = "点动+(前进)";
                        btnDelMove.Text = "点动-(后退)";
                        break;
                    case "料斗拉取进出轴":
                        btnAddMove.Text = "点动+(左移A侧)";
                        btnDelMove.Text = "点动-(右移B侧)";
                        break;
                    case "移栽升降轴":
                    case "料斗拉取升降轴":
                        btnAddMove.Text = "点动+(上升)";
                        btnDelMove.Text = "点动-(下降)";
                        break;
                    case "A面移栽X轴":
                    case "B面移栽X轴":
                        btnAddMove.Text = "点动+(后退)";
                        btnDelMove.Text = "点动-(前进)";
                        break;
                    case "A面移栽旋转轴":
                    case "B面移栽旋转轴":
                        btnAddMove.Text = "点动+(叉子水平)";
                        btnDelMove.Text = "点动-(叉子垂直)";
                        break;
                    case "A面移栽压紧轴":
                    case "B面移栽压紧轴":
                        btnAddMove.Text = "点动+(放松)";
                        btnDelMove.Text = "点动-(夹紧)";
                        break;
                    default:
                        btnAddMove.Text = "点动+";
                        btnDelMove.Text = "点动-";
                        break;
                }
                //if (cmbAxis.SelectedIndex.Equals(0))
                //{ 
                //    btnAddMove.Text = "点动+(下降)";
                //    btnDelMove.Text = "点动-(上升)";
                 
                //    color = Color.Blue;
                //}
                //else if (cmbAxis.SelectedIndex.Equals(1))
                //{
                //    btnAddMove.Text = "点动+(上升)";
                //    btnDelMove.Text = "点动-(下降)";
                //    //txtASpeed.Text = "1000";
                //    //txtjogSpeed.Text = "1000";
                //    color = Color.Green;
                //}
                txtASpeed.Text =(currSelAxis.TargetSpeed).ToString();
                txtMiddleSpeed.Text = (currSelAxis.TargetSpeed).ToString();
                btnOpenAxis.ForeColor = color;
                btnCloseAxis.ForeColor = color;
                btnAxisAMove.ForeColor = color;
                btnAxisRMove.ForeColor = color;
                btnAxisReturnHome.ForeColor = color;
                btnAxisStop.ForeColor = color;
                btnEndHome.ForeColor = color;
                btnAddMove.ForeColor = color;
                btnDelMove.ForeColor = color; 
            }
        }
        private void AxisMove(  int speed)
        {
            LogUtil.info(equipBase.Name+"界面点击【" + PortName + "_" + SlvAddr + "】点动: 速度:" + speed);
            AxisManager.instance.SpeedMove(PortName, SlvAddr, speed); 
        }
        private void btnAddMove_MouseDown(object sender, MouseEventArgs e)
        {
            if (btnAddMove.BackColor.Equals(btnBackColor))
            {
                int speed = FormUtil.GetIntValue(txtMiddleSpeed);
                if (speed <= 0)
                {
                    MessageBox.Show("提示", "请先输入正确的速度");
                    return;
                }
                btnAddMove.BackColor = Color.Green;
                AxisMove( speed);
            }
        }

        private void btnAddMove_MouseUp(object sender, MouseEventArgs e)
        {
            if (btnAddMove.BackColor == Color.Green     )
            {
                btnAddMove.BackColor = btnBackColor;
                AxisManager.instance.SuddenStop(PortName, SlvAddr);
                btnReadPosition_Click(null, null);
            }
        }

        private void btnDelMove_MouseDown(object sender, MouseEventArgs e)
        {
            if (btnDelMove.BackColor.Equals(btnBackColor))
            {
                int speed = FormUtil.GetIntValue(txtMiddleSpeed);
                if (speed <= 0)
                {
                    MessageBox.Show("提示", "请先输入正确的速度");
                    return;
                }
                btnDelMove.BackColor = Color.Green;
                AxisMove(-speed);
            }
        }

        private void btnDelMove_MouseUp(object sender, MouseEventArgs e)
        {
            if (  btnDelMove.BackColor == Color.Green)
            {
                btnDelMove.BackColor = btnBackColor;
                AxisManager.instance.SuddenStop(PortName, SlvAddr);
                btnReadPosition_Click(null, null);
            }
        }

        private void AxisMoveControl_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (this.Visible)
            {
                ReadAxisStatus();
            }
        }
        private void ReadAxisStatus()
        {
            string groupText = cmbAxis.Text + "-状态监控";
            if (!groupBox2.Text.Equals(groupText))
            {
                groupBox2.Text = groupText;
            }
            //【1】更新轴号
            short axisNo = SlvAddr;
            if (axisNo < 0)
            {
                return;
            }
            txtAxisPosition.Text = HCBoardManager.GetAxisCurrPos(axisNo).ToString();
            short modeValue = HCBoardManager.GetAxisPrfMode(axisNo);

            if (modeValue < 0)
            {
                return;
            }
            else
            {
                string mode = HCBoardManager.AxisPrfMode(modeValue);
                lblAxisPrfMode.Text = mode;
            }


            //【2】读取轴状态,如果读取出错将关闭此定时器
            AxisSts sts = HCBoardManager.GetAxisSts(axisNo);
            lblStatus.Text = sts.ToStr();
            if (sts.ServoOn < 0)
            {
                return;
            }
            //【3】更新界面显示
            ShowlbSts(lblALM, sts.ALM,true);  //报警信号
            ShowlbSts(lblWARN, sts.WARN);  //警告信号
            ShowlbSts(lblEMG, sts.EMG);//急停信号
            ShowlbSts(lblSvOn, sts.ServoOn); //使能信号
            ShowlbSts(lblBUSY, sts.BUSY);  //轴忙信号
            ShowlbSts(lblINP, sts.INP); //轴到位信号 
            if (sts.ORG < 0)
            {
                return;
            }
            ShowlbSts(lblPEL, sts.PEL); //正限位信号 
            ShowlbSts(lblORG, sts.ORG); //原点信号 
            ShowlbSts(lblNEL, sts.NEL); //负限位信号  

            //label59.Text = ConvertDecimalToBinary(nTimerAxSts[0]);   //轴状态是按bit进行解读,因此这里将AxSts转换为二进制bit进行显示
            lblAxPrfPos.Text = HCBoardManager.GetAxisPrfPos(axisNo).ToString();
            lblAxPrfVel.Text = HCBoardManager.GetAxisPrfVel(axisNo).ToString();
            //label62.Text = nTimerAxPrfAcc[0].ToString();
            lblAxEncPos.Text = HCBoardManager.GetAxisCurrPos(axisNo).ToString();
            lblAxEncVel.Text = HCBoardManager.GetAxisCurrVel(axisNo).ToString();
            lblAxEncAcc.Text = HCBoardManager.GetAxisCurrAcc(axisNo).ToString();
            //label65.Text = nTimerAxEncAcc[0].ToString();
            txtAxisPosition.Text = lblAxEncPos.Text;

            short value = HCBoardManager.GetHomeStatus(axisNo);
            string homesstr = HCBoardManager.AxisHomeSts(value);
            lblhomeSts.Text = homesstr;
            lblAxisType.Text = HCBoardManager.GetAxType(axisNo);

            //lblPosLmt.Text = HCBoardManager.GetEcatAxPosTorqLmt(axisNo).ToString();
            //lblNegLmt.Text = HCBoardManager.GetEcatAxNegTorqLmt(axisNo).ToString();
            //lblMaxLmt.Text = HCBoardManager.GetEcatAxMaxTorqLmt(axisNo).ToString();
        
        }
        private void ShowlbSts(Label lbl, int value, bool isAlarm = false)
        {
            if (value.Equals(1))
            {
                if (isAlarm)
                {
                    lbl.BackColor = Color.Red;
                    lblAlarmcode.Visible = true;
                    lblAlarmcode.ForeColor = Color.Red;
                    lblAlarmcode.Text = "错误码:" + HCBoardManager.GetAxErrCode(SlvAddr);
                }
                else
                {
                    lbl.BackColor = Color.Lime;
                }
            }
            else if (value.Equals(0))
            {
                lbl.BackColor = Color.LightGray;
                if (isAlarm)
                {
                    lblAlarmcode.Visible = false;
                }
            }
            else
            {
                lbl.BackColor = this.BackColor;
            }
        }
        public void StopTimer()
        {
            this.timer1.Stop();
        } 
        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Clipboard.SetText(txtAxisPosition.Text);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            HCBoardManager.FinishHome(SlvAddr);
        }
    }
}