|
均含核心 OOP 特性:封装 / 继承 / 多态 / 接口,适配上位机开发 案例 1 封装:PLC 设备基础类(封装属性 + 行为) 核心:字段私有、公开属性,对外隐藏细节 // PLC基础类,封装连接、读写核心行为public class PlcDevice{ // 私有字段封装 private string _ip; private int _port; private bool _isConnected; // 公开属性控制访问 public string Ip { get => _ip; set => _ip = value; } public int Port { get => _port; set => _port = value; } public bool IsConnected => _isConnected; // 方法封装业务逻辑 public bool Connect() { if(string.IsNullOrEmpty(_ip) || _port <=0) return false; _isConnected = true; Console.WriteLine($"PLC {_ip}:{_port} 连接成功"); return true; } public void Disconnect() { _isConnected = false; Console.WriteLine("PLC断开连接"); }}// 调用var s7Plc = new PlcDevice{Ip="192.168.1.10",Port=102};s7Plc.Connect(); 案例 2 继承:PLC 子类扩展(西门子 / 三菱) 核心:基类抽共性,子类扩特有功能,复用代码 // 继承自案例1的PlcDevice基类public class SiemensPlc : PlcDevice{ // 西门子特有功能 public bool ReadDB(int dbNum, int startAddr, out int value) { value = IsConnected ? new Random().Next(0,100) : 0; Console.WriteLine($"读西门子DB{dbNum}.DBW{startAddr},值:{value}"); return IsConnected; }}public class MitsubishiPlc : PlcDevice{ // 三菱特有功能 public bool ReadD(int dAddr, out int value) { value = IsConnected ? new Random().Next(0,100) : 0; Console.WriteLine($"读三菱D{dAddr},值:{value}"); return IsConnected; }}// 调用var siemens = new SiemensPlc{Ip="192.168.1.11",Port=102};siemens.Connect();siemens.ReadDB(1, 0, out var dbVal); 案例 3 多态:统一读写接口(子类重写方法) 核心:父类定义抽象方法,子类实现不同逻辑,统一调用 // 抽象基类,定义统一规范public abstract class BasePlc{ public string Ip { get; set; } public abstract bool Connect(); // 抽象方法,子类必须实现 public abstract bool ReadData(string addr, out int value); // 统一读写接口}// 西门子实现public class S7Plc : BasePlc{ public override bool Connect() { Console.WriteLine($"S7PLC {Ip} 连接"); return true; } public override bool ReadData(string addr, out int value) { value = new Random().Next(0,200); Console.WriteLine($"S7读{addr} → {value}"); return true; }}// 三菱实现public class FxPlc : BasePlc{ public override bool Connect() { Console.WriteLine($"FXPLC {Ip} 连接"); return true; } public override bool ReadData(string addr, out int value) { value = new Random().Next(0,200); Console.WriteLine($"FX读{addr} → {value}"); return true; }}// 多态调用:父类引用指向子类对象BasePlc plc1 = new S7Plc{Ip="192.168.1.12"};plc1.Connect();plc1.ReadData("DB2.DBW10", out _); 案例 4 接口:传感器通用规范(解耦) 核心:定义契约,无关类统一实现,适配多传感器 // 传感器接口(契约),工控场景高频用public interface ISensor{ string SensorId { get; } bool IsNormal { get; } double GetValue(); // 统一取值方法 void Calibrate(); // 统一校准方法}// 温度传感器实现public class TemperatureSensor : ISensor{ public string SensorId { get; } = "TEMP_001"; public bool IsNormal => true; public double GetValue() { var temp = new Random().Next(20,35) + new Random().NextDouble(); Console.WriteLine($"温度:{temp:F1}℃"); return temp; } public void Calibrate() => Console.WriteLine("温度传感器校准完成");}// 压力传感器实现public class PressureSensor : ISensor{ public string SensorId { get; } = "PRESS_001"; public bool IsNormal => true; public double GetValue() { var press = new Random().Next(0,10) + new Random().NextDouble(); Console.WriteLine($"压力:{press:F2}MPa"); return press; } public void Calibrate() => Console.WriteLine("压力传感器校准完成");}// 统一调用,解耦,方便扩展List<isensor> sensors = new List<isensor>{ new TemperatureSensor(), new PressureSensor()};foreach(var sensor in sensors){ sensor.Calibrate(); sensor.GetValue();} 案例 5 封装 + 属性:工控变量类(带校验) 核心:属性 set 加校验,保证数据合法性,适配上位机变量管控 // 工控变量类,属性带业务校验public class HmiTag{ private string _tagName; private double _tagValue; private double _minVal; private double _maxVal; // 标签名不能为空 public string TagName { get => _tagName; set => _tagName = string.IsNullOrEmpty(value) ? "Untitled" : value; } // 数值在上下限之间 public double TagValue { get => _tagValue; set { if(value < _minVal) _tagValue = _minVal; else if(value > _maxVal) _tagValue = _maxVal; else _tagValue = value; } } public HmiTag(double min, double max) { _minVal = min; _maxVal = max; } // 封装显示方法 public string ShowTagInfo() => $"[{TagName}] 当前值:{TagValue}(范围{_minVal}-{_maxVal})";}// 调用var tempTag = new HmiTag(0, 100) {TagName="炉温", TagValue=120}; // 超上限自动修正Console.WriteLine(tempTag.ShowTagInfo()); // [炉温] 当前值:100(范围0-100) 案例 6 静态类 + 单例:日志工具(实用 OOP 工具类) 核心:静态类(无实例)+ 单例(唯一实例),工控必备工具 // 1. 静态类:日志工具(无需实例,全局调用)public static class PlcLogHelper{ public static void WriteLog(string content) { var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Console.WriteLine($"[{time}] [INFO] {content}"); } public static void WriteError(string error) { var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Console.WriteLine($"[{time}] [ERROR] {error}"); }}// 2. 单例类:配置管理(全局唯一实例,避免重复加载)public class PlcConfigManager{ // 私有构造,禁止外部new private PlcConfigManager(){} // 唯一实例 private static PlcConfigManager _instance; // 线程安全锁 private static readonly object _lock = new object(); // 全局获取实例 public static PlcConfigManager GetInstance() { lock(_lock) { if(_instance == null) _instance = new PlcConfigManager(); return _instance; } } // 配置属性 public Dictionary<string,string> PlcConfigs { get; set; } = new Dictionary<string,string>(); // 加载配置 public void LoadConfig() { PlcConfigs.Add("S7_Ip", "192.168.1.10"); PlcConfigs.Add("Port", "102"); Console.WriteLine("PLC配置加载完成"); }}// 调用PlcLogHelper.WriteLog("上位机启动");var config = PlcConfigManager.GetInstance();config.LoadConfig(); 重点总结 1.封装→管控设备 / 变量状态,避免误操作。 2.继承→复用 PLC / 传感器共性代码,减少冗余。 3.多态 / 接口→适配多品牌设备,方便扩展(工控多品牌适配刚需)。 4.静态 / 单例→全局工具类(日志、配置),工控必备。 </isensor></isensor> 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |