微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Visual Studio C#延迟函数是否声明

如何解决Visual Studio C#延迟函数是否声明

我正在寻找一种在我的代码中创建延迟而不在此时间段内停止其余代码方法。它必须按如下方式工作。如果某个条件在X秒内为真,则将警报布尔值设置为“高”。下面的代码是我设置警报的代码的一部分,但需要延迟。

我对C#还是很陌生,所以请尝试将其简单化,也许是一个小例子或链接

if (Valve.Parameter.normallyOpen == false) 
{
    if (Valve.Status.Output == true & Valve.Status.Opened == false)
    {
        Valve.Alarm.NotOpened = true;
    }

    if (Valve.Status.Output == false & Valve.Status.Closed == false)
    {
        Valve.Alarm.NotClosed = true;
    }
} 

一些背景信息:这将是用C#编写的PLCNext中的阀门控制块。如果阀门已打开但在X秒内未给出打开反馈(需要时间打开),则控制块应发出警报。

 using System;
using System.Threading;
using System.Iec61131Lib;
using Iec61131.Engineering.Prototypes.Types;
using Iec61131.Engineering.Prototypes.Variables;
using Iec61131.Engineering.Prototypes.Methods;
using Iec61131.Engineering.Prototypes.Common;

namespace EclrFirmwareLibrary1
{
    [FunctionBlock]
    public class Valve_Test
    {
        [InOut]
        public Valve Valve;

        [Output]
        public bool Output;

        double seconds = 1.00; // 1 Second Interval
        

        [Initialization]
        public void __Init()
        {
            //
            // Todo: Initialize the variables of the function block here
            //
        }
        
        [Execution]
        public void __Process()
        {
            Valve.Status.Interlock = Valve.Control.Interlock;
            Valve.Status.Opened = Valve.Control.FB_Open;
            Valve.Status.Closed = Valve.Control.FB_Closed;
            
            if (Valve.Control.Manual_Mode == true){
                Valve.Status.Manual_Mode = true;
                Valve.Status.Auto_Mode = false;
            }
            if (Valve.Control.Auto_Mode == true & Valve.Control.Manual_Mode == false){
                Valve.Status.Manual_Mode = false;
                Valve.Status.Auto_Mode = true;
            }

            if(Valve.Status.Interlock == false & Valve.Alarm.General == false)
            {
                if (Valve.Status.Manual_Mode & Valve.Control.Manual_Control)
                {
                    Output = true;
                    Valve.Status.Output = true;
                }
                else if (Valve.Status.Auto_Mode & Valve.Control.Auto_Control)
                {
                    Output = true;
                    Valve.Status.Output = true;
                }
                else
                {
                    Output = false;
                    Valve.Status.Output = false;
                }
            }
            else
            {
                Output = false;
                Valve.Status.Output = false;
            }

            //Alarms---------------------------------------------------
            var startTimeSpan = TimeSpan.Zero;
            var periodTimeSpan = TimeSpan.FromSeconds(seconds);

            var timer = new System.Threading.Timer((e) =>
            {
                CheckValve();
            },null,startTimeSpan,periodTimeSpan);

        }
         
        private void CheckValve()
        {
            if (Valve.Parameter.normallyOpen == false)
            {
                if (Valve.Status.Output == true & Valve.Status.Opened == false)
                {
                    Valve.Alarm.NotOpened = true;
                }

                if (Valve.Status.Output == false & Valve.Status.Closed == false)
                {
                    Valve.Alarm.NotClosed = true;
                }
            }
            else
            {
                if (Valve.Status.Output == false & Valve.Status.Opened == false)
                {
                    Valve.Alarm.NotOpened = true;
                }
                if (Valve.Status.Output == true & Valve.Status.Closed == false)
                {
                    Valve.Alarm.NotClosed = true;
                }
            }
            
            if (Valve.Status.Opened == true & Valve.Status.Closed == true)
            {
                Valve.Alarm.OpenedAndClosed = true;
            }


            if (Valve.Alarm.NotClosed || Valve.Alarm.NotOpened || Valve.Alarm.OpenedAndClosed)
            {
                Valve.Alarm.General = true;
            }
        }

    }
}

解决方法

在这种情况下要注意的重要一点是,您使用的设备包括.NET运行时实现,该实现是整个.NET运行时的子集和特殊化。该“ eCLR”(嵌入式CLR)旨在在许多工业控制应用程序所需的确定性实时上下文中运行。

有关实现的详细信息,请参见PLCnext Info Center

在Visual Studio中创建PLCnext C#项目时,该项目包括“编程参考”(.chm文件)。从该参考资料中您将看到,eCLR中不包含Timer类。

对您的问题:

有多种方法可以在PLCnext C#函数中实现延迟函数。也许最简单的方法是使用DateTime.Now属性获取首次看到警报情况时的当前系统时间,并记住该值。然后,在每次调用Process方法时,您都可以将当前时间与首次看到警报条件的时间进行比较。当时间段超过预设时间时,将设置输出。

有关PLCnext Control设备相关问题的更多帮助,可以访问PLCnext Community。那里有一个活跃的论坛,您可以在这里与其他PLCnext用户讨论这类问题。

,

要每x秒调用一个方法,可以使用C#提供的TimeSpan方法,只需传递一个名为CheckValve的方法,即可将所有代码放入其中。

时间跨度示例:

double seconds = 1.00; // 1 Second Interval
var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromSeconds(seconds);

var timer = new System.Threading.Timer((e) =>
{
    CheckValve();   
},null,startTimeSpan,periodTimeSpan);


我也建议您重构一些代码:

您可以只用bool代替bool == true检查,而只用bool和a代替bool == false检查!在名字之前。

如果是的话,我也会添加一个else,如果if为true,则无需检查其他语句。

CheckValve方法:

private void CheckValve() {
    if (!Valve.Parameter.NormallyOpen) {
        if (Valve.Status.Output && !Valve.Status.Opened) {
            Valve.Alarm.NotOpened = true;
        }
        else if (!Valve.Status.Output && !Valve.Status.Closed)
        {
            Valve.Alarm.NotClosed = true;
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。