最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2023-08-15 14:14 作者:摸魚_專家  | 我要投稿

在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),如上升沿:

上升沿實(shí)際執(zhí)行方式

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

下降沿執(zhí)行效果

在上位機(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ī)邏輯就變得很爽了,沒有那么啰嗦

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

? ? }

}


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

分享到微博請遵守國家法律
玉环县| 江永县| 台北市| 措勤县| 琼结县| 新巴尔虎左旗| 梅河口市| 克拉玛依市| 上杭县| 措勤县| 涪陵区| 重庆市| 福海县| 桐乡市| 道真| 江北区| 建水县| 无为县| 定西市| 喀喇沁旗| 屏边| 庆城县| 南溪县| 长沙市| 易门县| 巴青县| 左贡县| 沁水县| 大英县| 蒙山县| 新民市| 新昌县| 大名县| 天台县| 西安市| 渑池县| 乌兰察布市| 西城区| 丹江口市| 昌宁县| 怀安县|