C#实现PLC上升沿,下降沿的功能

在B站看过好多上位机学习视频,还是没有得到我想要的功能,在此分享一个C#代码,本人一直在使用并未出现问题
(Tip:本人做过多年PLC与上位机经验,如果大家有兴趣,我会分享一个实用的经验,包含PLC)
进入正题。。。。
实现沿的本质就是一个bool变量记录一下状态,如上升沿:

下降沿只不过是执行位置与标记时候换了一个位置:

在上位机与PLC的通讯中基本上有多处这样交互,Mes CheckIn ,CheckOut等
那在代码中则充斥着大量的零散变量,从阅读性和维护性而言,实在是很痛苦(本人以前小白的时候有深刻体验/(ㄒoㄒ)/~~)
经过有那么一段时间,在面向百度编程,面向微软编程的时候,找到了一个特殊的东西,
将bool写个扩展方法,就是上升沿和下降沿的方法。与特性 [CallerLineNumber] 相结合
这个总的来说就是:在哪调用的行在方法里面会传进去,就像这样


传入了 62 这就是调用这个扩展方法的地方,然后记录一下数据,扩展方法的实现就和上面的案例一样,只不过添加了一个字典来记录;
那么常规逻辑就变得很爽了,没有那么啰嗦

这个还有一个隐藏的问题,那就是 [CallerLineNumber] 我多线程执行,都在同一行,那是不是就出现Bug了?哈哈哈哈,这个也有办法解决,大家可以自己思考一下,如果人多的话,我会考虑以后出视频教学!
最后我贴上代码吧
/// <summary>
/// 上升沿,下降沿扩展方法(bool)
/// </summary>
public static class EdgeCore
{
private static readonly Dictionary<int, bool> rEdges = new();
private static readonly Dictionary<int, bool> fEdges = new();
/// <summary>
/// 上升沿
/// </summary>
/// <param name="ldp"></param>
/// <param name="number"></param>
/// <returns></returns>
public static bool RiseEdge(this bool ldp, [CallerLineNumber] int number = 0)
{
if (!rEdges.ContainsKey(number))
{
rEdges.Add(number, false);
fEdges.Add(number, false);
}
if (ldp == false) rEdges[number] = false;
if (ldp && rEdges[number]) return false;
if (ldp && !rEdges[number])
{
rEdges[number] = true;
return true;
}
return false;
}
/// <summary>
/// 下降沿
/// </summary>
/// <param name="ldf"></param>
/// <param name="path"></param>
/// <returns></returns>
public static bool FallEdge(this bool ldf, [CallerLineNumber] int number = 0)
{
if (!rEdges.ContainsKey(number))
{
rEdges.Add(number, false);
fEdges.Add(number, false);
}
if (ldf == true)
{
fEdges[number] = true;
return false;
}
if (ldf == false && !fEdges[number])
{
fEdges[number] = false;
return false;
}
if (ldf == false && fEdges[number])
{
fEdges[number] = false;
return true;
}
return false;
}
}