工业控制系统中变量的抽象基类Variable抽象类

public abstract class Variable : INamed<string>
{
    private readonly GetValueDelegate getValueDelegate;

    private readonly SetValueDelegate setValueDelegate;

    private readonly string name;

    private readonly VariableContext context;

    private readonly int contextKey;

    private readonly int number;

    private readonly VariableType type;

    private readonly Controller controller;

    private readonly _PTR_DATA coreIdentifier;

    public string Name => name;

    public VariableContext Context => context;

    public int ContextKey => contextKey;

    public int Number => number;

    public VariableType ValueType => type;

    public object Value
    {
        get
        {
            return getValueDelegate(this);
        }
        set
        {
            setValueDelegate(this, value);
        }
    }

    internal Controller Controller => controller;

    internal _PTR_DATA CoreIdentifier => coreIdentifier;

    internal Variable(Controller controller, VariableType type, VariableContext context, int contextKey, int number, string name, GetValueDelegate getValueDelegate, SetValueDelegate setValueDelegate, _PTR_DATA coreIdentifier)
    {
        this.controller = controller;
        this.type = type;
        this.context = context;
        this.contextKey = contextKey;
        this.number = number;
        this.name = name;
        this.getValueDelegate = getValueDelegate;
        this.setValueDelegate = setValueDelegate;
        this.coreIdentifier = coreIdentifier;
    }
}

 

以下是针对 Variable 抽象类的专业解析,结合工业控制领域特性的深度分析:


1. 核心定位

该类是 工业控制系统中变量的抽象基类,作为连接以下两层的桥梁:

  • 上层应用:提供类型安全的变量访问接口

  • 底层硬件:通过委托模式对接不同设备的物理信号


2. 关键成员设计

2.1 核心字段
字段类型作用
getValueDelegateGetValueDelegate抽象取值操作,实现硬件信号读取的差异化
setValueDelegateSetValueDelegate抽象赋值操作,实现硬件信号写入的差异化
coreIdentifier_PTR_DATA原生层变量标识结构体,包含硬件地址等元信息
2.2 属性设计
属性类型工业控制典型用途
Valueobject统一访问接口,支持动态类型转换(如PLC中的ANY类型)
ContextVariableContext区分变量所在上下文(如全局/任务/IO模块等)
Numberint对应硬件寄存器/内存地址编号

3. 工业控制特性实现

3.1 硬件访问抽象化
// 通过委托将硬件操作与业务逻辑解耦
public delegate object GetValueDelegate(Variable variable);
public delegate void SetValueDelegate(Variable variable, object value);

// 具体实现示例(模拟量输入读取)
GetValueDelegate analogInputReader = v => {
    double raw = ReadHardwareRegister(v.Number);
    return raw * calibrationFactor;
};
3.2 多上下文支持
public enum VariableContext {
    Global,         // 全局变量
    Task,           // 任务专用变量  
    FieldbusInput,  // 现场总线输入
    VirtualIO       // 虚拟IO信号
}

设计意图:适应不同控制层级的需求。

3.3 类型安全机制
public enum VariableType {
    Double,         // 模拟量
    Integer,        // 整型数据
    Binary,         // 开关量
    String          // 文本数据
}

// 在派生类中强制类型检查
internal sealed class AnalogVariable : Variable {
    public new double Value {
        get => (double)base.Value;
        set => base.Value = value; 
    }
}

4. 运行时行为分析

4.1 值读写流程

4.2 派生类实现示例

 

// 数字量输入变量实现
public class DigitalInputVariable : Variable {
    public DigitalInputVariable(Controller ctrl, int ioNumber) 
        : base(ctrl, VariableType.Binary, VariableContext.IO, 0, ioNumber, 
              $"DI[{ioNumber}]", 
              v => ReadDigitalInput(v.Number),
              (v,val) => throw new InvalidOperationException("输入只读"))
    {}

    private static bool ReadDigitalInput(int address) {
        return (ReadHardwareWord(address) & 0x01) != 0;
    }
}

5. 设计优势

  1. 硬件无关性
    通过委托模式支持不同厂商设备驱动快速接入

  2. 性能优化

    • 避免虚方法调用开销(对比抽象方法)

    • 减少值类型装箱(通过派生类强类型封装)

  3. 工业协议兼容
    _PTR_DATA 结构体可携带PROFINET/Modbus等协议的原始地址信息

  4. 安全控制
    通过上下文和类型约束防止误操作(如对输入变量执行写入)


6. 典型应用场景

// 创建温度传感器变量
var tempVar = new AnalogVariable(controller, 
    context: VariableContext.FieldbusInput,
    address: 0x4000,
    name: "Temperatur1");

// 监控值变化
while(true) {
    double currentTemp = tempVar.Value;
    if(currentTemp > 80.0) {
        TriggerAlarm();
    }
    Thread.Sleep(100);
}

7. 改进建议

  1. 线程安全增强

private readonly object _syncLock = new object();
public object Value {
    get { lock(_syncLock) return getValueDelegate(this); }
    set { lock(_syncLock) setValueDelegate(this, value); }
}

历史记录支持

public event EventHandler<ValueChangedArgs> ValueChanged;

DI容器集成

services.AddTransient<Variable>(sp => {
    var ctx = sp.GetService<IOperationContext>();
    return new AnalogVariable(ctx.Controller, ...);
});

该设计完美体现了工业控制软件对 实时性可靠性 和 扩展性 的核心要求,是变量抽象层的经典实现范式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值