c#中public类比博图

简单来说,**`public` 定义了"接口"或"引脚"**,就像你的FB块上的 `Input`, `Output`, `InOut` 管脚一样。它决定了外部的其他代码(如另一个FB或OB1)可以看到和操作这个块里的什么东西。

让我用你最熟悉的博图概念来详细类比一下。


🔧 博图 FB 与 C# 类的直观对比

想象一下你在博图里创建一个**电机控制FB** `FB_Motor`:

  1. **你在接口区(Interface)定义变量**:

* `Input`: `Start`, `Stop`, `Reset`

* `Output`: `Ready`, `Running`, `Fault`

* `InOut`: `ActualSpeed`

* `Static`: `InternalTimer`, `StartupDelay` (这些是内部使用的,外部看不到)

  1. **在代码区编程**:使用这些管脚和内部变量实现逻辑。

  2. **在OB1中调用**:你拖拽这个FB到一个DB上(实例化),然后你**只能看到和连接**你定义在 `Input`/`Output` 上的管脚。你完全看不到、也无法直接访问 `InternalTimer` 或 `StartupDelay` 这些内部变量。


↔️ 现在,我们把上面的步骤"翻译"成 C#:

```csharp

// 1. 这相当于创建了一个新的 FB 块,类名就是FB名

public class MotorController

{

// 2. 定义接口区(Interface)的管脚

// Inputs - 相当于FB的Input管脚

public bool Start { get; set; } // 公共属性,外部可读可写

public bool Stop { get; set; } // 公共属性,外部可读可写

// Outputs - 相当于FB的Output管脚

public bool Ready { get; private set; } // 公共属性,外部只读 (就像PLC里的输出只能由FB内部控制)

public bool Running { get; private set; }

// Static/Internal - 相当于FB的Static变量

private System.Timers.Timer _internalTimer; // private 关键字:外部完全不可见,仅供内部使用

private int _startupDelay; // private 关键字:外部完全不可见,仅供内部使用

// 3. 这相当于在代码区编写逻辑

public void ProcessCycle() // 一个公共方法,相当于FB里的网络段,外部可以调用

{

if (Start && !Stop)

{

Running = true;

// ... 内部计时器逻辑等

}

else

{

Running = false;

}

// 更新Ready等其他状态

}

// 构造函数 - 相当于给FB的Static变量赋初始值

public MotorController()

{

_startupDelay = 5000; // 初始化内部变量

_internalTimer = new System.Timers.Timer();

}

}

```


📋 访问权限关键字与博图概念的对应表

| C# 关键字 | 博图中的对应概念 | 解释和用途 |

| :--- | :--- | :--- |

| **`public`** | **`Input`, `Output`, `InOut` 管脚** | **这就是你问的 `public`**。它就像FB的对外接口引脚,声明了"这是外部其他部分(如OB1)可以**看到和访问**的东西"。 |

| **`private`** | **`Static`, `Temp` 变量** | 这相当于FB内部的中间变量或状态位。它们被**隐藏和保护**起来,外部代码无法看到或直接修改,防止被意外干扰,保证了程序的封装性和可靠性。 |

| `internal` | (无直接对应) | 一个程序集内部可访问,可以理解为"项目内公开",但对整个解决方案外的代码隐藏。 |

| `protected` | (无直接对应) | 涉及继承,比如一个"高级电机FB"继承自你的"基础电机FB",它可以访问基类的一些特定内部变量。 |

💡 为什么需要 `public` 和 `private`?(核心思想差异)

* **博图/PLC编程**:硬件思维导向。**物理上**,你已经通过PLC的硬件组态定义了哪些是输入端子(I),哪些是输出端子(Q)。FB的接口区是这种硬件思维在软件上的延伸。**访问权限是由硬件和软件接口明确定义的,相对固定。**

* **C#/计算机编程**:软件架构思维导向。没有固定的硬件接口,所有代码都运行在同一个CPU和内存空间中。如果不加限制,任何代码都可以随意修改任何内存数据,这将导致灾难性的后果(比如一个UI按钮的代码错误地修改了电机的内部状态计数器)。

* 因此,需要通过 `public` 和 `private` 这些**访问修饰符**来**人为地、逻辑地**定义一套"接口规则",从而实现:

  1. **封装**:隐藏内部实现细节,只暴露必要的接口。外部只需要知道 `Start()` 方法能启动电机,而不需要知道内部用了哪个计时器。

  2. **安全性**:保护内部数据不被意外修改,提高代码的稳定性和可维护性。

  3. **模块化**:使得代码模块(类)之间耦合度降低,更容易独立设计和测试。

🎯 给你的实践建议

  1. **开始建模时**:把你想要创建的每一个设备(电机、阀门、传感器)都想象成一个 **FB**。

  2. **编写C#类时**:

* 问自己:"这个设备的**对外接口**(命令、状态信号)是什么?" -> 将这些字段/属性/方法设为 **`public`**。

* 问自己:"哪些是实现设备功能所需的**内部状态或中间变量**?" -> 将这些字段/属性设为 **`private`**。

  1. **调用时**:在你的 `Main` 函数(相当于OB1)中,你只能通过 `.` 操作符访问到那些 `public` 的成员,这完全模拟了在博图中只能连接FB块管脚的行为。

总结:**`public` 就是你FB块上的那些外部可见的管脚**。它是你刻意设计出来与外部世界通信的通道。理解了这一点,你就向成功转换思维迈出了一大步。

相关推荐
时光追逐者2 小时前
一个基于 .NET 开源、功能强大的分布式微服务开发框架
分布式·微服务·开源·c#·.net·.net core
Poetinthedusk2 小时前
设计模式-命令模式
windows·设计模式·c#·wpf·命令模式
csdn_aspnet5 小时前
C# 电子签名及文档存储
javascript·c#
乾元6 小时前
用 AI 做联动:当应用层出现问题,网络如何被“自动拉入决策回路”
运维·开发语言·网络·人工智能·ci/cd·自动化
武藤一雄6 小时前
一款基于WPF开发的BEJSON转换工具
windows·c#·json·wpf
csdn_aspnet7 小时前
MobaXterm 运维实战、技巧与自动化
运维·自动化·mobaxterm
Wpa.wk7 小时前
自动化测试(java) - PO模式了解
java·开发语言·python·测试工具·自动化·po模式
秦苒&7 小时前
【C语言】详解数据类型和变量(二):三种操作符(算数、赋值、单目)及printf
c语言·开发语言·c++·c#
张人玉7 小时前
c#常用的类
服务器·数据库·c#
凤希AI伴侣8 小时前
架构重构与AI能力聚焦:一人开发的自动化未来 凤希AI伴侣 · 开发日记 · 2025年12月20日
人工智能·重构·自动化·凤希ai伴侣