FrmPositionTool.cs 13.9 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 = ResourceCulture.GetString("升降轴位置调试:");
        private string PortName = "";
        private   short SlvAddr = 0;
        private string IoIp = "";
        private int IoIndex = 0; 
        private System.Timers.Timer toolTimer = new System.Timers.Timer();
   
        private ConfigMoveAxis configAxis;
        public FrmPositionTool(ConfigMoveAxis axis,string ioIp, int ioIndex,string name)
        {
            InitializeComponent();
            this.PortName = axis.DeviceName;
            this.SlvAddr = axis.GetAxisValue();
            configAxis = axis;
            this.IoIp = ioIp;
            this.IoIndex = ioIndex;

            toolTimer.Enabled = false;
            toolTimer.Interval = 50;
            toolTimer.AutoReset = true;
            toolTimer.Elapsed += ToolTimer_Elapsed;
            this.Text = name + "_升降轴位置调试";
            FrmPositionTool.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AxisManager.instance.IsShowMsg = false;

            LogUtil.logBox = this.richTextBox1;

            //AxisManager.instance.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> { "HC" });
            }

            P3Offset = ConfigAppSettings.GetIntValue(Setting_Init.Tool_P3_Offset);
            P4Offset = ConfigAppSettings.GetIntValue(Setting_Init.Tool_P4_Offset);
            P5Offset = ConfigAppSettings.GetIntValue(Setting_Init.Tool_P5_Offset);
            P6Offset = ConfigAppSettings.GetIntValue(Setting_Init.Tool_P6_Offset);
            int tSpeed = ConfigAppSettings.GetIntValue(Setting_Init.Tool_TargetSpeed);
            int tPosition = ConfigAppSettings.GetIntValue(Setting_Init.Tool_TargetPosition);

            if (P3Offset.Equals(0)) P3Offset = 60;
            if (P4Offset.Equals(0)) P4Offset = -60;
            if (P5Offset.Equals(0)) P5Offset = -60;
            if (P6Offset.Equals(0)) P6Offset = 60;
            if (tSpeed.Equals(0)) tSpeed = 20;
            if (tPosition.Equals(0)) tPosition = 60;

            txtP3Offset.Text = P3Offset.ToString();
            txtP4Offset.Text = P4Offset.ToString();
            txtP5Offset.Text = P5Offset.ToString();
            txtP6Offset.Text = P6Offset.ToString();
            txtSpeed.Text = tSpeed.ToString();
            txtPosition.Text = tPosition.ToString();

            SaveConfig(tSpeed, tPosition);

            //判断伺服是否已经打开
            bool isOn = AxisManager.instance.IsServeoOn(PortName, SlvAddr);
            formStatus(isOn);
            timer1.Start();
            ioSingle.IOName = ResourceCulture.GetString("激光检测信号"); 
        }
        private void btnServoOn_Click(object sender, EventArgs e)
        { 
            this.PortName = txtPortName.Text;
            this.SlvAddr = FormUtil.GetShortValue(txtAddr);
            bool result = AxisManager.instance.OpenPort(PortName);
            if (!result)
            {
                MessageBox.Show(ResourceCulture.GetString("打开串口失败"));
                return;
            }

            formStatus(true);
            AxisManager.instance.InitSlvAddr(PortName, SlvAddr, configAxis.TargetSpeed, configAxis.AddSpeed, configAxis.DelSpeed);
            Thread.Sleep(100);
            AxisManager.instance.AlarmClear(PortName, SlvAddr);
            AxisManager.instance.ServoOn(PortName, SlvAddr);
 
        }

        private void btnServoOff_Click(object sender, EventArgs e)
        {
            StopTimer();
            // toolTimer.Stop();
            AxisManager.instance.SuddenStop(PortName, SlvAddr);
            Thread.Sleep(100);
         
            AxisManager.instance.ServoOff(PortName, SlvAddr);
            formStatus(false);
        }

        private void formStatus(bool p)
        {
            txtPortName.Enabled =false ;
            txtAddr.Enabled = false ;
            txtIOIndex.Enabled =false ;
            txtIoIp.Enabled = false ;
          
            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 btnHomeMove_Click(object sender, EventArgs e)
        {
            int speed = Convert.ToInt32(txtSpeed.Text);
            AxisManager.instance.HomeMove(PortName, SlvAddr, configAxis.HomeHighSpeed,configAxis.HomeLowSpeed,configAxis.HomeAddSpeed);
        }
       
        private void btnGetActualPosition_Click(object sender, EventArgs e)
        {
            int value = AxisManager.instance.GetTargetPosition(PortName, SlvAddr);
            txtTargetPosition.Text = value.ToString();
            value = AxisManager.instance.GetActualtPosition(PortName, SlvAddr);
            txtActualPosition.Text = value.ToString();
        }
        private void SaveConfig(int speed,int position)
        {
            //保存配置
            ConfigAppSettings.SaveValue(Setting_Init.Tool_P3_Offset, P3Offset);
            ConfigAppSettings.SaveValue(Setting_Init.Tool_P4_Offset, P4Offset);
            ConfigAppSettings.SaveValue(Setting_Init.Tool_P5_Offset, P5Offset);
            ConfigAppSettings.SaveValue(Setting_Init.Tool_P6_Offset, P6Offset);
            ConfigAppSettings.SaveValue(Setting_Init.Tool_TargetSpeed, speed);
            ConfigAppSettings.SaveValue(Setting_Init.Tool_TargetPosition, position);
        }
        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(ResourceCulture.GetString("请输入正确的速度"));
                txtSpeed.Focus();
                return;
            }
            P3Offset = FormUtil.GetIntValue(txtP3Offset);
            P4Offset = FormUtil.GetIntValue(txtP4Offset);
            P5Offset = FormUtil.GetIntValue(txtP5Offset);
            P6Offset = FormUtil.GetIntValue(txtP6Offset);

            SaveConfig(speed, position);

            LastValue = IO_VALUE.LOW;
            string fileName = txtFileName.Text;
            string filePath = Application.StartupPath + @"\logs\" + fileName;
            if (File.Exists(filePath))
            {
                string msg = "文件【" + fileName + "】已存在,是否确定覆盖?";
                DialogResult result = MessageBox.Show(msg, "", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (!result.Equals(DialogResult.OK))
                {
                    return;
                }
            }
            PositionList = new List<int>();
            LogUtil.info(LogName + "伺服开始运动,速度【" + speed + "】位置【" + position + "】启动定时器 ");
            formMoveStatus(false);
            AxisManager.instance.AbsMove(PortName, SlvAddr, position, speed, configAxis.AddSpeed, configAxis.DelSpeed);
            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)
        {
            StopTimer();
            AxisManager.instance.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 = AxisManager.instance.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 = AxisManager.instance.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)+"】");
                        if (LogUtil.logBox == null)
                        {
                            this.richTextBox1.AppendText(LogName + "【" + num + "】【" + currPos + "】【" + Math.Abs(currPos - preValue) + "】"+Environment.NewLine);
                        }
                        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(), Encoding.UTF8);

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

                int value = AxisManager.instance.GetTargetPosition(PortName, SlvAddr);
                txtTargetPosition.Text = value.ToString();
                value = AxisManager.instance.GetActualtPosition(PortName, SlvAddr);
                txtActualPosition.Text = value.ToString();
            }
            catch (Exception ex)
            { 
            } 
        }

        private void FrmPositionTool_FormClosing(object sender, FormClosingEventArgs e)
        {
            timer1.Stop();
            if (btnServoOff.Enabled)
            {
                StopTimer();
                // toolTimer.Stop();
                AxisManager.instance.SuddenStop(PortName, SlvAddr);
                Thread.Sleep(100); 
            }
            LogUtil.logBox = null;
            //AxisManager.instance.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();
        }
    }
}