AxisTipControl.cs 8.4 KB
using DeviceLibrary;
using HuichuanLibrary;
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TheMachineNView
{
    //using AxisManager = OnlineStore.DeviceLibrary.AxisManager;
    public partial class AxisTipControl : Form
    {
        //static AxisManager AxisManager = AxisManager;
        public AxisTipControl()
        {
            InitializeComponent();
            this.Deactivate += AxisTipControl_Deactivate;
            this.LostFocus += AxisTipControl_LostFocus;
            this.TopMost = true;
            crc.OpenResourceLog = true;
            crc.LanguageChangeEvent += Crc_LanguageChangeEvent;
            crc.LanguageProcess(this);
        }
        private void Crc_LanguageChangeEvent(object sender, EventArgs e)
        {
            crc.LanguageProcess(this);
        }
        private void AxisTipControl_LostFocus(object sender, EventArgs e)
        {
            //this.Close();
        }

        private void AxisTipControl_Deactivate(object sender, EventArgs e)
        {
            this.Close();
        }

        short SlvAddr;
        string PortName;
        int targetSpeed;
        static Control c;
        public void ShowTips(Control _c, string title, short axisid, int _targetSpeed)
        {
            if (_c.Tag == null)
                return;

            if (c != null && c.Name == _c.Name)
                return;
            Text = title;
            /*var cp = c.PointToScreen(new Point(0, 0));
            var cc = this.Parent.PointToClient(cp);
            cc.Y += c.Height;
            this.Location = cc;
            */
            c = _c;
            SlvAddr = axisid;
            PortName = c.Name;
            targetSpeed = _targetSpeed;
            comjSpeed.Items.Clear();
            for (int i = 1; i <= 10; i++)
            {
                comjSpeed.Items.Add(targetSpeed * i / 10);
            }
            comjSpeed.SelectedIndex = 4;
            comjSpeed.KeyUp += ComjSpeed_KeyUp;
            SetRelList((int)comjSpeed.SelectedItem);

            //【2】读取轴状态,如果读取出错将关闭此定时器
            AxisSts sts = HCBoardManager.GetAxisSts(SlvAddr);
            if (sts.ServoOn < 0)
            {
                showToolTip(crc.GetString("Res0015", "伺服尚未使能"), c);
                return;
            }
            if (sts.ALM != 0 || sts.WARN != 0 || sts.EMG != 0)
            {
                showToolTip(crc.GetString("Res0016", "伺服警报状态中"), c);
                return;
            }
            readPosition();
            this.Show();
            //LanguageProcess();
        }

        private void ComjSpeed_KeyUp(object sender, KeyEventArgs e)
        {
            if (!int.TryParse(comjSpeed.Text, out _))
            {
                //e.Handled = false;
                return;
            }
            SetRelList(int.Parse(comjSpeed.Text));
        }

        private void ComjSpeed_KeyPress(object sender, KeyPressEventArgs e)
        {

        }

        void SetRelList(int speed)
        {
            flowLayoutPanel1.Controls.Clear();
            int[] zoom = new int[] { 1, 3, 5, 7, 9, 11 };
            for (int i = 0; i < zoom.Length; i++)
            {
                Button b = new Button();
                b.Size = new Size(60, 30);
                var bs = (int)Math.Floor(speed / (decimal)zoom[i]);
                b.Text = "+" + bs.ToString();
                b.Tag = bs;
                b.Click += B_Click;
                flowLayoutPanel1.Controls.Add(b);
            }
            for (int i = 0; i < zoom.Length; i++)
            {
                Button b = new Button();
                b.Size = new Size(60, 30);
                var bs = (int)Math.Floor(speed / (decimal)zoom[zoom.Length - i - 1]) * -1;
                b.Text = bs.ToString();
                b.Tag = bs;
                b.Click += B_Click;
                flowLayoutPanel1.Controls.Add(b);
            }
        }

        private void B_Click(object sender, EventArgs e)
        {
            var b = sender as Button;
            int pos = (int)b.Tag;
            LogUtil.info("【" + PortName + "_" + SlvAddr + "】相对运动: 点位:" + pos);
            AxisManager.RelMove(PortName, SlvAddr, pos, targetSpeed, targetSpeed * 3, targetSpeed * 3);
        }

        void showToolTip(string txt, Control control)
        {
            var m_ToolTip = new ToolTip();
            m_ToolTip.ToolTipIcon = ToolTipIcon.Warning;
            m_ToolTip.ToolTipTitle = crc.GetString("Res0017", "无法操作");
            m_ToolTip.AutoPopDelay = 0;
            m_ToolTip.AutomaticDelay = 0;
            m_ToolTip.InitialDelay = 0;
            m_ToolTip.ShowAlways = true;
            m_ToolTip.Show(txt, control);
            Task.Run(() =>
            {
                Task.Delay(5000).Wait();
                m_ToolTip.Dispose();
            });

        }
        private void AxisMove(int speed)
        {

            LogUtil.info("【" + PortName + "_" + SlvAddr + "】点动: 速度:" + speed);
            AxisManager.SpeedMove(PortName, SlvAddr, speed, speed * 4, speed * 4);

        }
        private void btnAddMove_MouseDown(object sender, MouseEventArgs e)
        {
            if (!CanMove(sender))
            {
                return;
            }
            if (btnAddMove.BackColor.Equals(Color.White))
            {
                int speed = Convert.ToInt32(comjSpeed.Text);
                if (speed <= 0)
                {
                    MessageBox.Show(crc.GetString("title", "提示"), crc.GetString("Res0013", "请先输入正确的速度"));
                    return;
                }
                btnAddMove.BackColor = Color.Green;
                AxisMove(speed);
            }
        }

        private void btnAddMove_MouseUp(object sender, MouseEventArgs e)
        {
            if (btnAddMove.BackColor == Color.Green)
            {
                btnAddMove.BackColor = Color.White;
                AxisManager.SuddenStop(PortName, SlvAddr);
                readPosition();
            }
        }
        void readPosition()
        {
            textBox_pos.Text = AxisManager.GetActualtPosition(PortName, SlvAddr).ToString();
        }

        private void btnDelMove_MouseDown(object sender, MouseEventArgs e)
        {
            if (!CanMove(sender))
            {
                return;
            }
            if (btnDelMove.BackColor.Equals(Color.White))
            {
                int speed = Convert.ToInt32(comjSpeed.Text);
                if (speed <= 0)
                {
                    MessageBox.Show(crc.GetString("title", "提示"), crc.GetString("Res0013", "请先输入正确的速度"));
                    return;
                }
                btnDelMove.BackColor = Color.Green;
                AxisMove(-speed);
            }
        }

        private void btnDelMove_MouseUp(object sender, MouseEventArgs e)
        {
            if (btnDelMove.BackColor == Color.Green)
            {
                btnDelMove.BackColor = Color.White;
                AxisManager.SuddenStop(PortName, SlvAddr);
                readPosition();
            }
        }
        bool CanMove(object sender)
        {
            AxisSts sts = HCBoardManager.GetAxisSts(SlvAddr);
            if (sts.ServoOn < 0)
            {
                showToolTip(crc.GetString("Res0015", "伺服尚未使能"), (Control)sender);
                return false;
            }
            if (sts.ALM != 0 || sts.WARN != 0 || sts.EMG != 0)
            {
                showToolTip(crc.GetString("Res0016", "伺服警报状态中"), (Control)sender);
                return false;
            }
            return true;
        }

        private void btn_cancel_Click(object sender, EventArgs e)
        {
            this.Close();
            //c.Select();
            //c.Focus();
        }

        private void btn_ok_Click(object sender, EventArgs e)
        {

            c.Text = textBox_pos.Text;
            this.Close();
        }

        private void AxisTipControl_Load(object sender, EventArgs e)
        {

        }

        private void comjSpeed_SelectedIndexChanged(object sender, EventArgs e)
        {
            SetRelList((int)comjSpeed.SelectedItem);
        }
    }
}