简单来说,**`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` (这些是内部使用的,外部看不到)

 

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

 

3. **在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`**。

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95999.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95999.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95999.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s基于节点软亲和的高 CPU Pod 扩容与优先调度方案

场景与目标 集群节点:master(4 核)、node1(16 核)、node2(16 核)。目标:将一个高 CPU 消耗的工作负载横向扩展到 4 个实例,并通过**节点亲和性(软亲和&#…

MySQL InnoDB 的锁机制

引言 锁是数据库管理并发访问的另一种核心机制,与 MVCC 相辅相成。本文将系统梳理 MySQL InnoDB 中锁的粒度、类型和工作原理,并深入探讨它如何与事务隔离级别配合,共同保障数据的一致性和完整性。 一、 锁的粒度:由粗到细 InnoD…

状态模式(State Pattern)——网络连接场景的 C++ 实战

一、为什么要用状态模式?在开发中,经常遇到“对象在不同状态下行为不同”的情况。最常见的写法是用一堆 if/else 或 switch 来判断状态,然后在不同分支里写逻辑。这样做有两个问题:状态增多后,条件分支会变得臃肿。修改…

使用csi-driver-nfs实现K8S动态供给

文章目录一、部署NFS二、k8s环境部署csi-nfs三、测试动态供给补充应用服务器IPnfs-server192.168.1.5k8s-master01192.168.1.1k8s-node01192.168.1.2k8s-node02192.168.1.3 一、部署NFS 1、在NFS服务端和k8s所有节点部署nfs-utils 因为客户端去挂载nfs服务端的共享目录时&…

【开题答辩全过程】以 基于ssm的房屋中介管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

MySQL主从复制之进阶延时同步、GTID复制、半同步复制完整实验流程

1.主从同步1.1主从同步原理是指将主库的DDL和DML操作通过二进制日志(binlog)传到从库服务器,然后在从库上对这些日志进行重新执行,从而使从库和主库数据保持一致1.2环境设置库名ip地址操作系统mysql版本主库msyql-master192.168.31.228rhel7.9源码安装my…

织信低代码:用更聪明的方式,把想法变成现实!

你有没有过这样的时刻?想亲手做一个应用,却因为“不会编码”而迟迟没有开始;或曾无奈地目睹公司里一个看似简单的需求,硬是耗费数月、投入大量人力反复开发……现在,有一类工具正在改变这一切。它叫低代码。而今天我们…

【序列晋升】28 云原生时代的消息驱动架构 Spring Cloud Stream的未来可能性

目录 一、Spring Cloud Stream是什么? 二、诞生背景与设计动机 2.1 微服务架构的挑战 2.2 Spring生态的发展 2.3 Spring Integration的演进 三、架构设计与核心组件 3.1 分层架构设计 3.2 核心组件详解 3.3 编程模型 四、解决的问题与优势 4.1 解决的核心…

内网后渗透攻击--linux系统(权限维持)

用途限制声明,本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具,严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果,作者及发布平台不承担任何责任。渗透测试涉及复杂技…

C++笔记之同步信号量、互斥信号量与PV操作再探(含软考题目)

C++笔记之同步信号量、互斥信号量与PV操作再探(含软考题目) code review! 参考笔记: 1.C++笔记之同步信号量、互斥信号量与PV操作再探(含软考题目) 2.C++笔记之信号量、互斥量与PV操作 参考链接 1.嵌入式基础知识-信号量,PV原语与前趋图 2.信号量、PV操作及软考高级试题解析…

布隆过滤器:快速判断某个元素是否存在

特点:高效、空间占用小、允许一定误判 布隆过滤器在 Redis 里的实现机制,核心就是:用一个大位图(bitmap)来表示集合 位图长度 m 初始值都是 0 插入元素时通过 k 个不同的哈希函数,对元素做哈希 每个哈希结…

C# 修改基类List中某一元素的子类类型

描述&#xff1a;基类&#xff1a;BaseClass子类1&#xff1a;A子类2&#xff1a;B然后我有一个List<BaseClass>类型的链表:list&#xff0c;我先往list中添加了两个元素&#xff1a;第一个元素为A类型&#xff0c;第二个元素为B类型&#xff0c;然后我想改变第一个元素类…

基于STM32智能阳台监控系统

基于STM32智能阳台监控系统&#xff08;程序&#xff0b;原理图元件清单&#xff09;功能介绍具体功能&#xff1a;1.采用STM32作为主控芯片实现检测和控制&#xff1b;2.通过光敏电阻采集光线&#xff0c;将当前光线值在LCD1602显示&#xff0c;低于50%控制LED亮&#xff0c;高…

动态维护有效区间:滑动窗口

右指针不断移动获取解&#xff0c;左指针不断移动缩小解范围 左指针的意义非常重要&#xff0c;相当于一个标兵&#xff0c;不断与这个标兵进行比较&#xff0c;如果符合要求&#xff0c;这左指针进行移动&#xff0c;并进行操作&#xff0c;如果不符合要求&#xff0c;则左指针…

嵌入式学习---(单片机)

1.UART的概念通用异步收发器&#xff0c;2个串口&#xff08;1个串口被用于ISP下载程序&#xff0c;1个串口被用于和主机之间的通信&#xff09;&#xff0c;RXD(接收信号线) TXD(发送信号线)2、单工、半双工、全双工概念对比维度单工&#xff08;Simplex&#xff09;半双工&am…

基于单片机的宠物屋智能系统设计与实现(论文+源码)

1设计思路本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c…

【面试】Java基础面试题

1. Java 基本数据类型有哪些&#xff1f;场景&#xff1a;面试官问「String 是不是基本类型&#xff1f;」答案要点&#xff1a;8 种基本类型&#xff1a;byte, short, int, long, float, double, char, boolean。String 是引用类型。追问链条&#xff1a;问&#xff1a;为什么…

PHP云课堂在线网课系统 多功能网校系统 在线教育系统源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 云课堂&#xff0c;依托腾讯云基础服务架构&#xff0c;采用C扩展框架Phalcon开发&#xff0c; 系统功能 实现了点播、直播、专栏、会员、积分、秒杀、微聊等。 友情提示&#xff1a;…

GEM5学习(4): 运行全系统模式的ARM系统

详细说明可以见官网 gem5: Extending gem5 for ARM 下载镜像 mkdir -p cpu_tests/benchmarks/bin/arm cd cpu_tests/benchmarks/bin/arm wget dist.gem5.org/dist/v22-0/test-progs/cpu-tests/bin/arm/Bubblesort wget dist.gem5.org/dist/v22-0/test-progs/cpu-tests/bin/arm…

快捷:常见ocr学术数据集预处理版本汇总(适配mmocr)

快捷&#xff1a;常见ocr学术数据集预处理版本汇总&#xff08;适配mmocr&#xff09;快捷&#xff1a;常见ocr学术数据集预处理版本汇总&#xff08;适配mmocr&#xff09;状态指标验证快捷&#xff1a;常见ocr学术数据集预处理版本汇总&#xff08;适配mmocr&#xff09; 状…