C# Event(事件) 和 PLC 信号事件

核心三要素
发布者(Publisher):发出信号的设备 / 类
→ 例子:PLC、传感器
事件(Event):信号变化的通知
→ 例子:DI 信号接通、报警产生
订阅者(Subscriber):处理信号的程序
→ 例子:记录日志、弹窗提示、执行动作

using System;

// 1. PLC 类(发布者:负责读取信号、触发事件)
public class PLC
{
// 2. 定义事件:当 DI 信号变化时触发
// 参数:信号编号(bool)、信号状态
public event Action<int, bool> DI_SignalChanged;

// 模拟 PLC 扫描信号
public void ScanSignal(int signalNumber, bool newState)
{
    Console.WriteLine($"\n[PLC扫描] 信号{signalNumber} 新状态: {newState}");

    // 3. 触发事件!通知上位机:信号变了
    DI_SignalChanged?.Invoke(signalNumber, newState);
}

}

// 主程序(订阅者:处理信号)
class Program
{
static void Main()
{
// 创建 PLC 对象
PLC plc = new PLC();

    // 4. 订阅事件(监听 PLC 信号变化)
    plc.DI_SignalChanged += OnDI_SignalChanged;

    // 模拟:PLC 信号变化
    plc.ScanSignal(1, true);   // 信号1 接通
    plc.ScanSignal(1, false);  // 信号1 断开
    plc.ScanSignal(2, true);   // 信号2 接通
}

// 事件处理方法:信号变化后自动执行
static void OnDI_SignalChanged(int signalNumber, bool state)
{
    string status = state ? "接通" : "断开";
    Console.WriteLine($"[上位机处理] 信号{signalNumber} 已{status}");
    
    // 在这里可以写:记录日志、弹窗、控制输出、触发流程
}

}

运行步骤
程序启动 → 创建 PLC 对象
订阅事件(+=):我要监听信号
调用 ScanSignal → 模拟信号变化
PLC 输出信号状态
触发事件 Invoke()
自动执行 OnDI_SignalChanged
上位机处理信号(记录 / 提示 / 动作)

posted @ 2026-04-06 00:50  菜鸟的奋斗军  阅读(2)  评论(0)    收藏  举报