FrmPositionTool.cs 12.6 KB
using OnlineStore;
using DeviceLibrary;
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.ACSingleStore
{
    public partial class FrmPositionTool : Form
    {
        private string LogName = crc.GetString("Res0207","升降轴位置调试:");
        AxisBean UpDown_Axis;
        string iotype="";

        string PortName;
        short SlvAddr;
        private System.Timers.Timer toolTimer = new System.Timers.Timer();
        public FrmPositionTool(AxisBean UpDown_Axis, string iotype)
        {
            InitializeComponent();
            showLogProDelegate = new ShowLogProDelegate(ShowLogPro);
            //LogUtil.ShowLog += LogUtil_ShowLog;
            this.Shown += FrmPositionTool_Shown;
            this.UpDown_Axis = UpDown_Axis;
            this.iotype = iotype;
            PortName = UpDown_Axis.Config.DeviceName;
            SlvAddr = UpDown_Axis.Config.GetAxisValue();
            toolTimer.Enabled = false;
            toolTimer.Interval = 20;
            toolTimer.AutoReset = true;
            toolTimer.Elapsed += ToolTimer_Elapsed;

            FrmPositionTool.CheckForIllegalCrossThreadCalls = false;
        }

        private void FrmPositionTool_Shown(object sender, EventArgs e)
        {
            crc.LanguageProcess(this);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            txtIOIndex.Text = RobotManage.Config.DIList[iotype].ElectricalDefinition;

            ConfigHelper.Config.PropertyBind<uint>("PositionTool_HOffset", txtHOffset, "Text", "TextChanged");
            ConfigHelper.Config.PropertyBind<uint>("PositionTool_LOffset", txtLOffset, "Text", "TextChanged");
            ConfigHelper.Config.PropertyBind<uint>("PositionTool_Target", txtPosition, "Text", "TextChanged");
            ConfigHelper.Config.PropertyBind<uint>("PositionTool_Speed", txtSpeed, "Text", "TextChanged");

            //判断伺服是否已经打开
            bool isOn = UpDown_Axis.IsServeoOn;
            formStatus(isOn);
            if (isOn)
                timer1.Start();
            ioStatusControl1.IOName = crc.GetString(L.detect_signal, "检测信号");
        }

        delegate void ShowLogProDelegate(string msg, Color color);
        ShowLogProDelegate showLogProDelegate;
        private void LogUtil_ShowLog(string msg, Color color)
        {
            if (this.InvokeRequired)
                this.Invoke(showLogProDelegate, msg, color);
            else
                ShowLogPro(msg, color);

        }

        private List<string> logList = new List<string>();
        public int showCount = 60;
        private void ShowLogPro(string msg, Color color)
        {
            try
            {
                if (logList.Count >= showCount)
                {
                    logList.RemoveAt(0);
                }

                DateTime now = DateTime.Now;
                logList.Add(now.ToLongTimeString() + "  " + msg + Environment.NewLine);
                logBox.Text = string.Join("", logList);
                logBox.Select(logBox.Text.Length, 0);
                logBox.ScrollToCaret();
            }
            catch (Exception ex)
            {
                LogUtil.error("出错:" + ex.ToString());
            }
        }
        private void btnServoOn_Click(object sender, EventArgs e)
        {
            if (UpDown_Axis.Open(false, out _))
            {
                formStatus(true);
            }
        }

        private void btnServoOff_Click(object sender, EventArgs e)
        {
            StopTimer();
            UpDown_Axis.ServoOff();
            formStatus(false);
        }

        private void formStatus(bool 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; 
        }
         
        private void btnClear_Click(object sender, EventArgs e)
        {
            this.logBox.Text = "";
        }
 
        private void btnHomeMove_Click(object sender, EventArgs e)
        {
            var moveAxis = UpDown_Axis.Config;
            var HomeAddSpeed = moveAxis.HomeAddSpeed > 0 ? moveAxis.HomeAddSpeed : moveAxis.HomeHighSpeed * 6;
            var HomeLowSpeed = moveAxis.HomeLowSpeed > 0 ? moveAxis.HomeLowSpeed : moveAxis.HomeHighSpeed / 10;
            AxisManager.HomeMove(PortName, SlvAddr, moveAxis.HomeHighSpeed, HomeLowSpeed, HomeAddSpeed);
        }
        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(crc.GetString("Res0208","请输入正确的速度"));
                txtSpeed.Focus();
                return;
            }
            LOffset = FormUtil.GetIntValue(txtLOffset);
            HOffset = FormUtil.GetIntValue(txtHOffset);


            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 + "】启动定时器 ");
            LogUtil_ShowLog("伺服开始运动,速度【" + speed + "】位置【" + position + "】启动定时器 ", Color.Red);
            formMoveStatus(false);
            var moveAxis = UpDown_Axis.Config;
            var addSpeed = moveAxis.AddSpeed > 0 ? moveAxis.AddSpeed : speed * 4;
            var delSpeed = moveAxis.DelSpeed > 0 ? moveAxis.DelSpeed : speed * 4;
            AxisManager.AbsMove(PortName, SlvAddr, position, speed, addSpeed, delSpeed);
            toolTimer.Start();
        }
        private int LOffset = 0;
        private int HOffset = 0;
        private void formMoveStatus(bool status)
        {
            txtFileName.Enabled = status;
            txtHOffset.Enabled = status;
            txtLOffset.Enabled = status;
            txtSpeed.Enabled = status;
            txtPosition.Enabled = status;

        }
        private void btnSdStop_Click(object sender, EventArgs e)
        {
            toolTimer.Stop();
            AxisManager.SuddenStop(PortName, SlvAddr);
            formMoveStatus(true);
        }

        private IO_VALUE GetSingleValue()
        {
            return IOManager.IOValue(iotype);
        } 
        private int TargetPostion = 0;
        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)
        {
 
            if (!Monitor.TryEnter(UpDown_Axis))
            {
                return;
            }
            try
            {
                int moveS = AxisManager.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 > 3)
                    {
                        int currPos = AxisManager.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) + "】");
                        LogUtil_ShowLog("【" + num + "】【" + currPos + "】【" + Math.Abs(currPos - preValue) + "】", Color.Red);
                        LastValue = IO_VALUE.HIGH;
                        LastGetPTime = DateTime.Now;
                    }

                    LastValue = currValue;

                }
                else
                {
                    StopTimer();
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(LogName + "ToolTimer_Elapsed" + ex.ToString());
            }
            finally {
                Monitor.Exit(UpDown_Axis);
            }
        }

        private void StopTimer()
        {
            toolTimer.Stop(); 
            if (PositionList.Count <= 0)
            {
                return;
            }
            LogUtil.info(LogName + "伺服已停止运动,停止定时器,记录数据");
            List<string> strList = new List<string>();
            strList.Add(crc.GetString("Res0209","编号,标准位置,升降轴库位入料高点P3,升降轴库位入料低点P4"));
            int index = 1;
            foreach (int p in PositionList)
            {
                int LP = p + LOffset;
                int HP = p + HOffset;

                string resultstr = index + "," + p + ","+ HP + ","+ LP;
                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 + "】成功");
                LogUtil_ShowLog("保存位置到文件【" + filePath + "】成功", Color.Red);
            }
            catch (Exception ex)
            {
                LogUtil.error(LogName + "保存位置到文件【" + filePath + "】出错:" + ex.ToString());
                LogUtil_ShowLog("保存位置到文件【" + filePath + "】出错:" + ex.ToString(), Color.Red);
            }
            formMoveStatus(true );
        } 
        private void timer1_Tick(object sender, EventArgs e)
        { 
            try
            {
                var homests = AxisManager.GetHomeEndStatus(PortName, SlvAddr);
                var servisop = AxisManager.ServerOnStatus(PortName, SlvAddr);
                int moveS = AxisManager.GetBusyStatus(PortName, SlvAddr);
                label_servosts.Text = $"{crc.GetString(L.FrmPositionTool_serv_state, "伺服状态")}:{(servisop ? crc.GetString(L.FrmPositionTool_enable, "已使能") : crc.GetString(L.FrmPositionTool_disable, "未使能"))}, {crc.GetString(L.FrmPositionTool_homests, "原点状态")}:{(homests == 3 ? crc.GetString(L.FrmPositionTool_finish, "已完成") : crc.GetString(L.FrmPositionTool_unfinish, "未完成"))}, {crc.GetString(L.FrmPositionTool_busysts, "忙碌状态")}:{(moveS == 1 ? crc.GetString(L.FrmPositionTool_busying, "忙碌中") : crc.GetString(L.free, "空闲中"))}";

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

        private void FrmPositionTool_FormClosing(object sender, FormClosingEventArgs e)
        {
            timer1.Stop();
            if (btnServoOff.Enabled)
            {
                StopTimer();
                // toolTimer.Stop();
                AxisManager.SuddenStop(PortName, SlvAddr);
                Thread.Sleep(100); 
            }
        }

        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();
        }

    }
   
}