c# testfunc

public string cmd(string str)
            {
                lock (this)
                {
                    int cont = 0; 
                    Label1:
                    try
                    {
                        if (!clientSocket.Connected)
                        {
                            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                            cont++;
                            clientSocket.Connect(new IPEndPoint(ip, port));
                            System.Threading.Thread.Sleep(100);
                            goto Label1;
                        }

                        clientSocket.Send(Encoding.ASCII.GetBytes(str));
                        send = str; //可以添加控件显示发送的数据
                        byte[] result = new byte[1024];
                        int receiveLength = clientSocket.Receive(result);
                        Encoding.ASCII.GetString(result, 0, receiveLength);
                        return System.Text.Encoding.Default.GetString(result) + "\r\n";
                    }
                    catch (SocketException ex)
                    {
                        if (ex.SocketErrorCode == SocketError.NetworkReset ||
                            ex.SocketErrorCode == SocketError.ConnectionAborted ||
                            ex.SocketErrorCode == SocketError.ConnectionRefused)
                        {
                            clientSocket.Close();
                            System.Threading.Thread.Sleep(100);
                            goto Label1;
                        }
                    }
                }
                return "";
            }

public void Demo()
        {
            //左工位流程
            do
            {
                //这里要判断左工位checkbox按钮是否已勾上,启用,右工位同理,要保存到配置文件中
                while (!motion.getPLC.ReadSinglePoint("R60"))//判断左工位是否正在运行中
                {
                    Thread.Sleep(10);//这里是判断
                }

                while (!motion.getPLC.ReadSinglePoint("R104"))//上位机监控是否到达扫描位
                {
                    Thread.Sleep(10);
                }
                //开始扫码
                //上位机判断扫描是否异常,异常包括扫描超时,条码内容有误,ok发给plc,ng也发给plc
                //是否处理mes

            } while (true);


            CheckBox check = new CheckBox();
            check.Checked = true;
            if (check.Checked) //左升降原点触
            {
                motion.getPLC.WriteSinglePoint("R20",true);
                while (!motion.getPLC.ReadSinglePoint("R32"))
                {
                    Thread.Sleep(10);
                }

                check.Checked = false;
            }

            if (check.Checked) //右升降原点触
            {
                motion.getPLC.WriteSinglePoint("R21",true);
                while (!motion.getPLC.ReadSinglePoint("R33"))
                {
                    Thread.Sleep(10);
                }

                check.Checked = false;
            }

            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R22",true);
                while (!motion.getPLC.ReadSinglePoint("R30"))
                {
                    Thread.Sleep(10);
                }

                check.Checked = false;
            }

            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R23",true);
                while (!motion.getPLC.ReadSinglePoint("R31"))
                {
                    Thread.Sleep(10);
                }
                check.Checked = false;
            }

            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R24",true);
                while (!motion.getPLC.ReadSinglePoint("R34"))
                {
                    Thread.Sleep(10);
                }
                check.Checked = false;
            }

            if (check.Checked)
            {
                //左吹气触
                motion.getPLC.WriteSinglePoint("R10",true);
                while (!motion.getPLC.ReadSinglePoint("Y21"))
                {
                    Thread.Sleep(10);
                }
                check.Checked = false;
            }

            if (check.Checked)
            {
                //右吹气触
                motion.getPLC.WriteSinglePoint("R11",true);
                while (!motion.getPLC.ReadSinglePoint("Y22"))
                {
                    Thread.Sleep(10);
                }
                check.Checked = false;
            }

            if (check.Checked)
            {
                //左工位气缸触
                motion.getPLC.WriteSinglePoint("R12",true);
                while (!motion.getPLC.ReadSinglePoint("Y23"))
                {
                    Thread.Sleep(10);
                }
                check.Checked = false;
            }

            if (check.Checked)
            {
                //左工位气缸触
                motion.getPLC.WriteSinglePoint("R13",true);
                while (!motion.getPLC.ReadSinglePoint("Y24"))
                {
                    Thread.Sleep(10);
                }
                check.Checked = false;
            }
            //取消combox旁边的使能,放在面板上

            //启用左工位压力判断等这些combox,这些checkbox明天地址给出,往plc里面写

            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R19",true);
                check.Checked = false;
            }

            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R1A",true);
                check.Checked = false;
            }

            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R1B",true);
                check.Checked = false;
            }

            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R2B",true);
            }
            else
            {
                motion.getPLC.WriteSinglePoint("R2B", false);
            }


            if (check.Checked)
            {
                motion.getPLC.WriteSinglePoint("R2D", true);
            }
            else
            {
                motion.getPLC.WriteSinglePoint("R2D", false);
            }
            /* 左进出回原完成
                 右进出回原完成
             左升降回原完成
                 右升降回原完成
             一键回原完成
                 放在输入显示*/

            //R60 R70左工位执行中右工位执行中,通过判断这两个地址来判断是否手动和自动模式,只要其中有一个工位为自动模式,程序就往下走
            while (!motion.getPLC.ReadSinglePoint("R60") || !motion.getPLC.ReadSinglePoint("R70"))
            {
                Thread.Sleep(10);//手动模式在当前等待
            }
            //自动模式处理.........


            //添加左工位和右工位CheckBox按钮来选择自动运行的工位,还要写入配置文件


            //上电,开软件,连接plc,通知plc回零,等待plc通知回零成功,如果回零失败,人工复位,重启软件就是重新死循环(回到之前的发送plc回零指令)
            //人工复位物理按钮(外部)
            while (!motion.getPLC.ReadSinglePoint("XE"))//等待复位信号
            {
                Thread.Sleep(10);
            }

            //报警信息,提示报警对话框,不能操作
            //点击界面上的报警复位后,再按下物理启动处理

            /*放io面板
                左进出回原完成 checkbox
                右进出回原完成 checkbox
                左升降回原完成 checkbox
                右升降回原完成 checkbox
                一键回原完成*/

            /*注释 需要读取的灯 放io面板
            左升降安全位
                右升降安全位
            手动操作允许
                原点复归中
            自动运行中
                左进出在待机位
            左进出在目标位
                右进出在待机位
            右进出在目标位
                左升降在待机位
            左升降在目标位
                右升降在待机位
            右升降在目标位
                左升降在安全位
            右升降在安全位

                左压力检测到达
            右压力检测到达
                左加热温度到达
            右加热温度到达
                左扫码位到达
            左测距位1到达
                左测距位2到达
            右扫码位到达
                右测距位1到达
            右测距位2到达
                左一段位到达
            左二段位到达
                左三段位到达
            右一段位到达
                右二段位到达
            右三段位到达
                左低速上升位到达
            右低速上升位到达*/


            //读取加热器寄存器的数值返回错误码,根据错误码打印相关故障状态字符串
            

            //原始信息
            /*
             *不能一直勾,点击选中后立即取消,读取到回原中取消勾
               保存参数时要判断当前的状态是否为手动状态,不为手动状态不能保存
               
               左工位运行中,右工位运行中,不允许修改参数同上,
               
               
               根据左吹气阀判断勾是否取消
               
               取消使能,放在面板上
               
               启动左工位压力判断 这些checkbox明天地址给出,往plc里面写
               
               
               报警复位触、左工位计数清零、右工位计数清零,点一下勾就取消
               
               
               左加热器启动加热和左加热器停止加热共用R2B,右加热器同理
               
               左进出回原完成
               右进出回原完成
               左升降回原完成
               右升降回原完成
               一键回原完成
               放在输入显示
               
               R60 R70左工位执行中右工位执行中,通过判断这两个地址来判断是否手动和自动模式
               
               
               报警复位
               左计数清零
               右计数清零
               checkbox按下立即取消勾选了
               
               添加左工位和右工位按钮来选择自动运行的工位
               
               重启软件就是重新死循环
               
               手自动切换流程取消
               
               报警信息,提示报警对话框,不能操作
               
               读取寄存器的数值返回错误码,根据错误码处理
               
               点击报警复位后,再按下启动处理
               
               报警复位触点CheckBox勾上后,勾立即取消
             *
             */
        }

工位良品计数和次品计数都是读的
工位目标产量设定,到达后弹窗提示,停止加工
左和右计数清零,继续加工
读左加热器故障状态,读左加热器告警状态,弹窗     x输入 y输出

try catch plc对象改到MainForm类里
 

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        private Thread idleThread;
        private volatile bool isRunning;
        private ManualResetEvent activityEvent;
        public Form1()
        {
            InitializeComponent();

            // 创建线程和事件
            idleThread = new Thread(IdleThreadProc);
            activityEvent = new ManualResetEvent(false);
            isRunning = true;

            // 添加事件处理程序,用于重置事件
            this.MouseMove += ResetActivityEvent;
            this.KeyPress += ResetActivityEvent;

            // 启动线程
            idleThread.Start();
        }

        private void ResetActivityEvent(object sender, EventArgs e)
        {
            activityEvent.Set(); // 设置事件为 signaled 状态
        }

        private void IdleThreadProc()
        {
            while (true)
            {
                // 等待事件或超时
                if (activityEvent.WaitOne(600000)) // 等待 10 分钟
                {
                    activityEvent.Reset(); // 重置事件为 non-signaled 状态
                }
                else
                {
                    // 超时,切换用户权限到操作员模式
                    Invoke(new Action(SwitchToOperatorMode));
                    //isRunning = false; // 停止线程
                }
            }
        }

        private void SwitchToOperatorMode()
        {
            int a = 10;
            // 更新用户权限
            // ... 

            // 更新界面显示
            // ... 
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            idleThread.Abort();
        }
    }
}

namespace PCShutDown
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
 
            bool createdNew;//返回是否赋予了使用线程的互斥体初始所属权
            System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元变量
            if (createdNew) //赋予了线程初始所属权,也就是首次使用互斥体
            {
                Application.Run(new MainFrm());
                instance.ReleaseMutex();
            }
            else
            {
                MessageBox.Show("已经有一个程序已经在运行,请不要同时运行多个程序!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
 
           
        }
    }
 
 
     
 
}


using System;
using System.Windows.Forms;

public partial class MainForm : Form
{
    private Timer idleTimer;
    private DateTime lastActivityTime;

    public MainForm()
    {
        InitializeComponent();

        // 初始化定时器
        idleTimer = new Timer();
        idleTimer.Interval = 600000; // 10分钟 (600,000 毫秒)
        idleTimer.Tick += IdleTimer_Tick;

        // 记录最后活动时间
        lastActivityTime = DateTime.Now;

        // 添加事件处理程序,用于重置定时器
        this.MouseMove += ResetIdleTimer;
        this.KeyPress += ResetIdleTimer;

        // 启动定时器
        idleTimer.Start();
    }

    private void ResetIdleTimer(object sender, EventArgs e)
    {
        lastActivityTime = DateTime.Now;
        idleTimer.Stop();
        idleTimer.Start();
    }

    private void IdleTimer_Tick(object sender, EventArgs e)
    {
        // 检查是否超过 10 分钟无操作
        TimeSpan idleTime = DateTime.Now - lastActivityTime;
        if (idleTime.TotalMinutes >= 10)
        {
            // 切换用户权限到操作员模式
            SwitchToOperatorMode();

            // 停止定时器
            idleTimer.Stop();
        }
    }

    private void SwitchToOperatorMode()
    {
        // 更新用户权限
        // ... 

        // 更新界面显示
        // ... 
    }
}


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值