FrmPositionTool.cs 12.3 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;
          
            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*/ });
            }
            //判断伺服是否已经打开
            bool isOn = ACServerManager.ServerOnStatus(PortName, SlvAddr);
            formStatus(isOn);
            timer1.Start();
            ioStatusControl1.IOName = "检测信号";
        }
        private void btnServoOn_Click(object sender, EventArgs e)
        {
            //PositionList.Add(32000);
            //PositionList.Add(38000);
            //PositionList.Add(44000);
            //PositionList.Add(50000);
            //PositionList.Add(56000);
            //P3Offset = FormUtil.GetIntValue(txtP3Offset);
            //P4Offset = FormUtil.GetIntValue(txtP4Offset);
            //P5Offset = FormUtil.GetIntValue(txtP5Offset);
            //P6Offset = FormUtil.GetIntValue(txtP6Offset);
            //StopTimer();
            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;
            }
            P3Offset = FormUtil.GetIntValue(txtP3Offset);
            P4Offset = FormUtil.GetIntValue(txtP4Offset);
            P5Offset = FormUtil.GetIntValue(txtP5Offset);
            P6Offset = FormUtil.GetIntValue(txtP6Offset);
            LastValue = IO_VALUE.LOW;
            string fileName = txtFileName.Text;
            string filePath = Application.StartupPath +  @"\logs\" + 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+"】启动定时器 ");
            formMoveStatus(false);
            ACServerManager.AbsMove(PortName, SlvAddr, position,speed);
            toolTimer.Start();
        }
        private int P3Offset = 0;
        private int P4Offset = 0;
        private int P5Offset = 0;
        private int P6Offset = 0;
        private void formMoveStatus(bool status)
        {
            txtFileName.Enabled = status;
            txtP5Offset.Enabled = status;
            txtP3Offset.Enabled = status;
            txtP4Offset.Enabled = status;
            txtP6Offset.Enabled = status;
            txtSpeed.Enabled = status;
            txtPosition.Enabled = status;

        }
        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 DateTime LastGetPTime = DateTime.Now;
        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();
                    TimeSpan checkSpan = DateTime.Now - LastGetPTime;
                    if (LastValue.Equals(IO_VALUE.LOW) && currValue.Equals(IO_VALUE.HIGH)&&checkSpan.TotalSeconds>2)
                    {
                        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;
                        LastGetPTime = DateTime.Now;
                    }

                    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 + "伺服已停止运动,停止定时器,记录数据");
            List<string> strList = new List<string>();
            strList.Add("编号,标准位置,升降轴库位出料前点P5,升降轴库位出料缓冲点P6,升降轴库位入料前点P3,升降轴库位入料缓冲点P4");
            int index = 1;
            foreach (int p in PositionList)
            {
                int P3 = p + P3Offset;
                int P4 = p + P4Offset;
                int P5 = p + P5Offset;
                int P6 = p + P6Offset;

                string resultstr = index + "," + p + ","+P5+","+P6+","+P3+","+P4+"";
                strList.Add(resultstr);
                index++;
            }

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

                LogUtil.error(LogName + "保存位置到文件【" + filePath + "】成功");
            }
            catch (Exception ex)
            {
                LogUtil.error(LogName + "保存位置到文件【" + filePath + "】出错:" + ex.ToString());
            }
            formMoveStatus(true );
        } 
        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)
            {
                StopTimer();
                // toolTimer.Stop();
                ACServerManager.SuddenStop(PortName, SlvAddr);
                Thread.Sleep(100); 
            }
            //ACServerManager.CloseAllPort();
            //IOManager.instance.CloseAllConnection(); 
        }

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

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