C#实现PLC上升沿,下降沿的功能
2023-08-16 10:49:10 来源: 哔哩哔哩

在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 (!(number))

{

(number, false);

(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 (!(number))

{

(number, false);

(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;

}

}

关键词:

责任编辑:zN_1646