您的位置:首页 > 教育 > 锐评 > 北京智能建站系统价格_腾讯云域名管理_北京seo外包平台_渠道网官网

北京智能建站系统价格_腾讯云域名管理_北京seo外包平台_渠道网官网

2025/5/12 1:19:37 来源:https://blog.csdn.net/qq_26303227/article/details/146226384  浏览:    关键词:北京智能建站系统价格_腾讯云域名管理_北京seo外包平台_渠道网官网
北京智能建站系统价格_腾讯云域名管理_北京seo外包平台_渠道网官网

我们在上位机开发中,经常会涉及到沿信号检测的问题。

今天跟大家分享一下如何实现沿信号检测。

一、什么是沿信号

首先我们要了解一下什么是沿信号。

上升沿是指信号从低电平到高电平的变化瞬间。

下降沿是指信号从高电平到低电平的变化瞬间。

检测这个变化在PLC控制或上位机系统中很常见。

图片

在上位机开发中,比如检测报警变化,上位机与PLC之间进行逻辑信号交互等情况下都会涉及到沿信号检测的问题。

二、代码实现

那么我们如何通过代码来实现呢?

首先我们需要创建一个类,这个类就像PLC编程中的指令一样,拖一个指令到PLC程序中,相当于实例化这个类的实例,其实C#代码的实现和PLC指令的实现原理是一样的,只不过在PLC中,是厂家封装好了,我们直接使用。

一、我们首先创建一个类RisingEdgeDetector,然后创建一个字段_previousState,用来存储上次的值,通过构造方法传递一个初始值,一般情况下,上升沿初始值是False,但是为了更灵活,可以由用户传值进去,然后不断调用CheckForRisingEdge方法来判断是否触发沿信号变化。


/// <summary>
/// 上升沿检测类(边缘触发检测)
/// </summary>
public class RisingEdgeDetector
{private bool _previousState;/// <summary>/// 初始化检测器/// </summary>/// <param name="initialState">初始输入状态(默认false)</param>public RisingEdgeDetector(bool initialState = false){_previousState = initialState;}/// <summary>/// 检测输入信号的上升沿变化/// </summary>/// <param name="currentState">当前输入状态</param>/// <returns>是否检测到上升沿</returns>public bool CheckForRisingEdge(bool currentState){bool edgeDetected = !_previousState && currentState;_previousState = currentState;return edgeDetected;}/// <summary>/// 重置检测器状态/// </summary>public void Reset(bool initialState = false){_previousState = initialState;}
}

二、实际使用也非常简单,直接创建一个RisingEdgeDetector对象,inputSequence是模拟从PLC或下位机读取到的某个变量的值,然后调用即可。


// 初始化检测器(可选设置初始状态)
var edgeDetector = new RisingEdgeDetector();// 模拟输入序列
bool[] inputSequence = { false, false, true, true, false, true };foreach (var input in inputSequence)
{bool detected = edgeDetector.CheckForRisingEdge(input);Console.WriteLine($"输入 {input} \t 检测到上升沿: {detected}");
}/* 输出结果:
输入 False     检测到上升沿: False
输入 False     检测到上升沿: False
输入 True      检测到上升沿: True
输入 True      检测到上升沿: False
输入 False     检测到上升沿: False
输入 True      检测到上升沿: True
*/

    三、在实际应用中,我们可能需要考虑信号抖动的情况,可以在原来的基础上,增加一个防抖动的功能,同时,为了考虑线程安全,加上锁处理。

    /// <summary>
    /// 带消抖处理的上升沿检测器(精确到毫秒级)
    /// </summary>
    public class DebouncedRisingEdgeDetector
    {private bool _previousState;private DateTime _lastTriggerTime = DateTime.MinValue;private readonly int _debounceMs;private readonly object _lock = new object();/// <summary>/// 初始化消抖检测器/// </summary>/// <param name="debounceMilliseconds">消抖时间(毫秒)</param>/// <param name="initialState">初始输入状态</param>public DebouncedRisingEdgeDetector(int debounceMilliseconds, bool initialState = false){_debounceMs = debounceMilliseconds > 0 ? debounceMilliseconds : 10;_previousState = initialState;}/// <summary>/// 检测输入信号的有效上升沿/// </summary>public bool CheckForRisingEdge(bool currentState){lock (_lock){bool edgeDetected = false;bool potentialEdge = !_previousState && currentState;if (potentialEdge){TimeSpan elapsed = DateTime.UtcNow - _lastTriggerTime;if (elapsed.TotalMilliseconds > _debounceMs){edgeDetected = true;_lastTriggerTime = DateTime.UtcNow;}}_previousState = currentState;return edgeDetected;}}/// <summary>/// 重置检测器状态/// </summary>public void Reset(bool initialState = false){lock (_lock){_previousState = initialState;_lastTriggerTime = DateTime.MinValue;}}
    }

    四、测试结果如下:

    // 初始化50ms消抖的检测器
    var debounceDetector = new DebouncedRisingEdgeDetector(50);
    // 模拟带抖动的输入序列
    bool[] noisyInputs = { false, true, false, true, true, false, true, true };
    foreach (var input in noisyInputs)
    {bool validEdge = debounceDetector.CheckForRisingEdge(input);Console.WriteLine($"输入 {input,-5} 有效触发: {validEdge}");// 模拟实际应用中的时间间隔Thread.Sleep(30); 
    }/* 输出结果:
    输入 False 有效触发: False
    输入 True  有效触发: True  ← 首次触发
    输入 False 有效触发: False
    输入 True  有效触发: False ← 30ms后仍在消抖期
    输入 True  有效触发: False
    输入 False 有效触发: False
    输入 True  有效触发: True  ← 超过50ms后再次触发
    输入 True  有效触发: False
    */

      五、对于下降沿检测,原理是相通的,这里就不赘述了。我们可以参考上述代码编写一个下降沿检测的类,也可以将上升沿和下降沿检测放到同一个类中,通过构造方法传值来判断为上升沿或下降沿。

      版权声明:

      本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

      我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com