『7x24小时有问必答』
均含核心 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>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码