C#實(shí)現(xiàn)PLC上升沿,下降沿的功能

在B站看過好多上位機(jī)學(xué)習(xí)視頻,還是沒有得到我想要的功能,在此分享一個C#代碼,本人一直在使用并未出現(xiàn)問題
(Tip:本人做過多年P(guān)LC與上位機(jī)經(jīng)驗(yàn),如果大家有興趣,我會分享一個實(shí)用的經(jīng)驗(yàn),包含PLC)
進(jìn)入正題。。。。
實(shí)現(xiàn)沿的本質(zhì)就是一個bool變量記錄一下狀態(tài),如上升沿:

下降沿只不過是執(zhí)行位置與標(biāo)記時(shí)候換了一個位置:

在上位機(jī)與PLC的通訊中基本上有多處這樣交互,Mes CheckIn ,CheckOut等
那在代碼中則充斥著大量的零散變量,從閱讀性和維護(hù)性而言,實(shí)在是很痛苦(本人以前小白的時(shí)候有深刻體驗(yàn)/(ㄒoㄒ)/~~)
經(jīng)過有那么一段時(shí)間,在面向百度編程,面向微軟編程的時(shí)候,找到了一個特殊的東西,
將bool寫個擴(kuò)展方法,就是上升沿和下降沿的方法。與特性?[CallerLineNumber] 相結(jié)合
?這個總的來說就是:在哪調(diào)用的行在方法里面會傳進(jìn)去,就像這樣


傳入了 62 這就是調(diào)用這個擴(kuò)展方法的地方,然后記錄一下數(shù)據(jù),擴(kuò)展方法的實(shí)現(xiàn)就和上面的案例一樣,只不過添加了一個字典來記錄;
那么常規(guī)邏輯就變得很爽了,沒有那么啰嗦

這個還有一個隱藏的問題,那就是??[CallerLineNumber]? 我多線程執(zhí)行,都在同一行,那是不是就出現(xiàn)Bug了?哈哈哈哈,這個也有辦法解決,大家可以自己思考一下,如果人多的話,我會考慮以后出視頻教學(xué)!
最后我貼上代碼吧
/// <summary>
/// 上升沿,下降沿?cái)U(kuò)展方法(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;
? ? }
}