c#中如何编写信号超时报警

csharp 复制代码
/// <summary>
/// 信号超时监控器 - 用于检测信号异常超时
/// </summary>
public class SignalTimeoutMonitor
{
    private DateTime _startTime;           // 开始计时的时间
    private bool _isMonitoring = false;    // 是否正在监控
    private int _timeoutSeconds;           // 超时时间(秒)

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="timeoutSeconds">超时时间(秒),默认5秒</param>
    public SignalTimeoutMonitor(int timeoutSeconds = 5)
    {
        _timeoutSeconds = timeoutSeconds;
    }

    /// <summary>
    /// 检查信号是否超时
    /// </summary>
    /// <param name="expectedSignal">期望的信号值(例如:true表示期望传感器到位)</param>
    /// <param name="actualSignal">实际的信号值(例如:传感器实际状态)</param>
    /// <returns>true=超时需要报警,false=正常</returns>
    public bool CheckTimeout(bool expectedSignal, bool actualSignal)
    {
        // 情况1:信号已经相等(正常)
        if (expectedSignal == actualSignal)
        {
            StopMonitoring();  // 停止监控
            return false;       // 不需要报警
        }

        // 情况2:信号不相等,需要开始或继续监控
        if (!_isMonitoring)
        {
            // 第一次发现信号不相等,开始计时
            StartMonitoring();
            return false;  // 刚开始,还不需要报警
        }

        // 情况3:正在监控中,检查是否超时
        TimeSpan elapsedTime = DateTime.Now - _startTime;
        if (elapsedTime.TotalSeconds >= _timeoutSeconds)
        {
            return true;  // 超时了,需要报警!
        }

        return false;  // 还没超时,继续等待
    }

    /// <summary>
    /// 开始监控
    /// </summary>
    private void StartMonitoring()
    {
        _startTime = DateTime.Now;
        _isMonitoring = true;
    }

    /// <summary>
    /// 停止监控
    /// </summary>
    private void StopMonitoring()
    {
        _isMonitoring = false;
    }

    /// <summary>
    /// 手动重置监控器
    /// </summary>
    public void Reset()
    {
        StopMonitoring();
    }

    /// <summary>
    /// 获取已经等待的时间(秒)
    /// </summary>
    public double GetElapsedSeconds()
    {
        if (!_isMonitoring)
            return 0;
        
        return (DateTime.Now - _startTime).TotalSeconds;
    }
}

//-----------------------在这里插入代码片下面是使用上述类的样例程序-------------------

csharp 复制代码
// 创建监控器,超时时间5秒
SignalTimeoutMonitor cylinderMonitor = new SignalTimeoutMonitor(5);

// 在PLC扫描周期中不断调用(例如每100ms)
void CheckCylinderPosition()
{
    bool cylinderExtendCommand = true;   // 气缸伸出命令(已发出)
    bool sensorDetected = ReadSensor();   // 读取传感器状态(实际值)

    // 检查是否超时
    bool isTimeout = cylinderMonitor.CheckTimeout(
        expectedSignal: cylinderExtendCommand,  // 期望:命令已发出=true
        actualSignal: sensorDetected            // 实际:传感器是否检测到
    );

    if (isTimeout)
    {
        // 超时报警
        ShowAlarm("气缸伸出超时!传感器未检测到到位信号");
        StopMachine();  // 停机
        cylinderMonitor.Reset();  // 重置监控器
    }
}

// 模拟读取传感器
bool ReadSensor()
{
    // 这里读取PLC中的传感器状态
    return PLC.ReadBool("DB1.DBX0.0");
}