FrmPositionTool.cs 10.1 KB

using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OnlineStore.AutoInOutStore
{
    public partial class FrmPositionTool : FrmBase
    {
        private string LogName = "升降轴位置调试:";
        private string PortName = "";
        private   int SlvAddr = 0;
        private string IoIp = "";
        private int IoIndex = 0;
        public string Axis_Brake = IO_Type.Axis_Brake;
        private System.Timers.Timer toolTimer = new System.Timers.Timer();
        public FrmPositionTool(string protName, int slvAddr,string ioIp, int ioIndex)
        {
            InitializeComponent();
            this.PortName = protName;
            this.SlvAddr = slvAddr;
            this.IoIp = ioIp;
            this.IoIndex = ioIndex;

            toolTimer.Enabled = false;
            toolTimer.Interval = 100;
            toolTimer.AutoReset = true;
            toolTimer.Elapsed += ToolTimer_Elapsed;

            FrmPositionTool.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ACServerManager.IsShowMsg = false;
            LogUtil.logBox = this.richTextBox1;
            //ACServerManager.richeBox = this.richTextBox1;
            formStatus(false);
            CheckForIllegalCrossThreadCalls = false;
            txtPortName.Text = PortName;
            txtAddr.Text = SlvAddr.ToString();
            txtIOIndex .Text= IoIndex.ToString();
            txtIoIp.Text = IoIp.ToString();

            if (IOManager.instance == null)
            {
                IOManager.Init();
                IOManager.instance.ConnectionIOList(new List<string> { IoIp });
            }
            timer1.Start();
        }
        private void btnServoOn_Click(object sender, EventArgs e)
        {
            this.PortName = txtPortName.Text;
            this.SlvAddr = FormUtil.GetIntValue(txtAddr);
            bool result = ACServerManager.OpenPort(PortName);
            if (!result)
            {
                MessageBox.Show("打开串口失败!");
                return;
            }

            formStatus(true);
            ACServerManager.InitSlvAddr(PortName, SlvAddr);
            Thread.Sleep(100);
            ACServerManager.AlarmClear(PortName, SlvAddr);
            ACServerManager.ServoOn(PortName, SlvAddr);

            try
            {
                IOManager.IOMove(Axis_Brake, IO_VALUE.HIGH);
            }catch(Exception ex)
            {

            }
        }

        private void btnServoOff_Click(object sender, EventArgs e)
        {
            StopTimer();
           // toolTimer.Stop();
            ACServerManager.SuddenStop(PortName, SlvAddr);
            Thread.Sleep(100);
            try
            {
                IOManager.IOMove(Axis_Brake, IO_VALUE.LOW);
            }
            catch (Exception ex)
            {

            }
            ACServerManager.ServoOff(PortName, SlvAddr);
            formStatus(false );

        
        }

        private void formStatus(bool p)
        {
            txtPortName.Enabled = !p;
            txtAddr.Enabled = !p;
            txtIOIndex.Enabled = !p;
          //  txtIoIp.Enabled = !p;
          
            btnAbsMove.Enabled = p;  
            btnSdStop.Enabled = p; 
            btnHomeMove.Enabled = p; 
            timer1.Enabled = p;
            btnServoOff.Enabled = p;
            btnServoOn.Enabled = !p; 
            btnGetActualPosition.Enabled = p; 
        }
         
        private void btnClear_Click(object sender, EventArgs e)
        {
            this.richTextBox1.Text = "";
        }

        private void btnRelMove_Click(object sender, EventArgs e)
        {
            int position = Convert.ToInt32(txtPosition.Text);
            ACServerManager.RelMove(PortName, SlvAddr, position);
        } 
        private void btnHomeMove_Click(object sender, EventArgs e)
        {
            int speed = Convert.ToInt32(txtSpeed.Text);
            ACServerManager.HomeMove(PortName, SlvAddr, speed);
        }
        private void btnSpeedMove_Click(object sender, EventArgs e)
        {
            int speed = Convert.ToInt32(txtSpeed.Text);
            ACServerManager.SpeedMove(PortName, SlvAddr, speed);
        }
        private void btnGetActualPosition_Click(object sender, EventArgs e)
        {
            int value = ACServerManager.GetTargetPosition(PortName, SlvAddr);
            txtTargetPosition.Text = value.ToString();
            value = ACServerManager.GetActualtPosition(PortName, SlvAddr);
            txtActualPosition.Text = value.ToString();
        }

        private void btnAbsMove_Click(object sender, EventArgs e)
        {
            int speed = Convert.ToInt32(txtSpeed.Text);
            int position = Convert.ToInt32(txtPosition.Text.Trim(), 10);
            TargetPostion = position;

            if (speed<=(0))
            {
                MessageBox.Show("请输入正确的速度");
                txtSpeed.Focus();
                return;
            }
            LastValue = IO_VALUE.LOW;
            string fileName = txtFileName.Text;
            string filePath = Application.StartupPath + @"\" + fileName;
            if (File.Exists(filePath))
            {
                DialogResult result = MessageBox.Show("文件【"+filePath+"】已存在,是否确定覆盖?","", MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
                if (!result.Equals(DialogResult.OK))
                {
                    return;
                }
            }
            PositionList = new List<int>(); 
            LogUtil.info(LogName + "伺服开始运动,速度【"+speed+"】位置【"+position+"】启动定时器 ");
            ACServerManager.AbsMove(PortName, SlvAddr, position,speed);
            toolTimer.Start();
        } 
      
        private void btnSdStop_Click(object sender, EventArgs e)
        {
            toolTimer.Stop();
            ACServerManager.SuddenStop(PortName, SlvAddr);
        }

        private IO_VALUE GetSingleValue()
        {
            return IOManager.instance.GetDIValue(IoIp, 0, (ushort)IoIndex);
        }
             


        private int TargetPostion = 0;
        private bool isInProcesss = false;
        private DateTime LastTime = DateTime.Now;
        private List<int> PositionList = new List<int>();
        private IO_VALUE LastValue = IO_VALUE.LOW;
        private void ToolTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            TimeSpan span = DateTime.Now - LastTime;
            if (isInProcesss && span.TotalSeconds < 1)
            {
                return;
            }
            isInProcesss = true;
            try
            {
                int moveS = ACServerManager.GetBusyStatus(PortName, SlvAddr);
                if (moveS.Equals(1))
                {
                    IO_VALUE currValue = GetSingleValue();
                    if (LastValue.Equals(IO_VALUE.LOW) && currValue.Equals(IO_VALUE.HIGH))
                    {
                        int currPos = ACServerManager.GetActualtPosition(PortName, SlvAddr);
                        txtActualPosition.Text = currPos.ToString();
                        PositionList.Add(currPos);
                        int num = PositionList.Count;
                        int preValue = 0;
                        if (PositionList.Count > 1)
                        {
                            preValue = PositionList[num - 2];
                        }
                        LogUtil.info(LogName + "收到信号,【"+ num + "】【" + currPos+"】,差值【"+Math.Abs(currPos-preValue)+"】");
                        LastValue = IO_VALUE.HIGH;
                    }

                    LastValue = currValue;

                }
                else
                {
                    StopTimer();
                }
            }catch(Exception ex)
            {
                LogUtil.error(LogName+"ToolTimer_Elapsed" + ex.ToString());
            }
            isInProcesss = false;
        }

        private void StopTimer()
        {
            toolTimer.Stop();
            if (PositionList.Count <= 0)
            {
                return;
            }
            LogUtil.info(LogName + "伺服已停止运动,停止定时器,记录数据");
            string resultstr = "";
            int index = 1;
            foreach (int p in PositionList)
            {
                resultstr += index + "," + p + "\r\n";
                index++;
            }

            string fileName = txtFileName.Text;
            string filePath = Application.StartupPath + @"\" + fileName;
            try
            {
                //        Clipboard.SetDataObject(resultstr);
                File.WriteAllText(filePath, resultstr);

                LogUtil.error(LogName + "保存位置到文件【" + filePath + "】成功");
            }
            catch (Exception ex)
            {
                LogUtil.error(LogName + "保存位置到文件【" + filePath + "】出错:" + ex.ToString());
            }
        } 
        private void timer1_Tick(object sender, EventArgs e)
        {

            try
            {
                ioStatusControl1.IOValue = (int)GetSingleValue();
                ioStatusControl1.ShowData();
            }
            catch (Exception ex)
            {

            }
             
        }

        private void FrmPositionTool_FormClosing(object sender, FormClosingEventArgs e)
        {
            timer1.Stop();
            if (btnServoOff.Enabled)
            {
                btnServoOff_Click(null, null);
            }
            //ACServerManager.CloseAllPort();
            IOManager.instance.CloseAllConnection();

        }

        private void btnOpenFolder_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("Explorer.exe", Application.StartupPath);
        }

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