硬件架构基础:PLC芯片的CPU核心、内存映射、I/O接口、总线结构

好,咱们进入第二章。这一章讲的是PLC芯片的硬件骨架。说白了,就是芯片内部到底长什么样,各个模块怎么分工,数据怎么流动。

我刚开始接触PLC芯片设计时,总觉得这东西就是个单片机加一堆外设。后来真正做项目才发现,PLC对实时性、确定性的要求,跟普通嵌入式系统完全是两码事。你想想看,工厂里一条产线停一分钟可能损失几十万,芯片必须保证每个扫描周期都精确无误。

2.1 CPU核心:逻辑扫描的“大脑”

PLC芯片的CPU核心,跟咱们电脑里的CPU不太一样。它不需要跑复杂的操作系统,也不需要处理多任务抢占。它的核心任务就一个:循环执行用户逻辑程序

我个人习惯把PLC的CPU核心分为三个关键部分:

  • 指令执行单元:专门处理PLC指令集,比如LD(取)、AND(与)、OUT(输出)。这些指令比ARM指令简单得多,但执行速度要求极高。
  • 状态寄存器组:保存当前扫描周期的输入状态、输出状态、中间变量。我见过一些设计把状态寄存器放在片内SRAM里,结果访问延迟导致扫描周期抖动。
  • 中断控制器:处理紧急事件,比如急停信号、高速计数器溢出。注意,PLC的中断优先级是固定的,不能像通用CPU那样随意调整。

核心要点:PLC的CPU核心追求的不是峰值性能,而是确定性。每个指令的执行时间必须是固定的,不能有缓存未命中这种不确定性。

我在项目中遇到过一个问题:某款国产PLC芯片,CPU核心用了ARM Cortex-M4,结果发现逻辑扫描周期不稳定。查了半天,原来是Cortex-M4的指令缓存导致的。后来我们强制关闭了缓存,才解决了问题。

2.2 内存映射:地址空间的“城市规划”

内存映射,说白了就是给芯片里的每个存储单元分配一个门牌号。PLC芯片的内存映射跟普通单片机不太一样,它需要同时兼顾用户程序存储数据存储外设寄存器

我建议你记住这张典型的内存映射表:

地址范围 用途 说明
0x0000 - 0x3FFF 用户程序区(Flash) 存储梯形图或ST语言编译后的机器码
0x4000 - 0x4FFF 系统固件区(Flash) Bootloader、运行时库,一般用户不可写
0x5000 - 0x5FFF 输入映像区(I区) 每个扫描周期开始时,从物理输入端口读取
0x6000 - 0x6FFF 输出映像区(Q区) 每个扫描周期结束时,写入物理输出端口
0x7000 - 0x7FFF 变量存储区(V区) 中间变量、定时器、计数器当前值
0x8000 - 0x8FFF 外设寄存器区 UART、SPI、定时器外设的控制寄存器

设计技巧:我曾经设计过一款芯片,把输入映像区和输出映像区放在片内SRAM的不同Bank里。这样CPU可以同时访问输入和输出,不会产生总线冲突。嗯,这个小改动让扫描周期缩短了15%。

为什么会这样设计?因为PLC的扫描周期是固定的。每个周期开始,CPU先把所有物理输入读到输入映像区,然后执行用户程序,最后把输出映像区写到物理输出。这种“批量读写”的方式,保证了逻辑执行期间输入状态不会变化。

2.3 I/O接口:与外部世界的“桥梁”

I/O接口是PLC芯片跟传感器、执行器打交道的通道。跟普通MCU的GPIO不同,PLC的I/O接口有严格的电气隔离和抗干扰要求。

常见的I/O接口类型:

  • 数字量输入(DI):24V电平检测,带光耦隔离。我建议每个输入通道都加一个RC滤波,防止抖动。
  • 数字量输出(DO):继电器或晶体管输出。晶体管输出响应快,但带载能力弱;继电器输出相反。
  • 模拟量输入(AI):0-10V或4-20mA信号采集,需要ADC转换。注意,PLC的ADC分辨率一般12-16位就够了,太高反而增加成本。
  • 模拟量输出(AO):DAC转换后输出模拟信号,用于控制变频器、阀门等。
  • 高速计数器(HSC):专门处理编码器脉冲信号,频率可达几百kHz。

避坑指南:我曾经设计过一款PLC芯片,数字量输入没有加TVS管。结果现场有静电放电,直接把输入引脚打坏了。从那以后,我所有I/O接口都强制加ESD保护。

2.4 总线结构:数据流动的“高速公路”

总线结构决定了芯片内部各个模块之间怎么通信。PLC芯片的总线设计,核心要求是低延迟确定性

我常用的总线架构有两种:

  1. 单总线架构:CPU、内存、外设都挂在一条总线上。优点是设计简单,缺点是容易产生总线冲突。适合低端PLC。
  2. 多总线架构:把程序总线、数据总线、外设总线分开。CPU可以同时取指令和读写数据,性能大幅提升。中高端PLC基本都用这种。

下面这张图展示了典型的多总线架构:

CPU核心 指令执行单元 程序总线 程序存储器 数据总线 数据存储器 桥接器 外设总线 UART SPI 定时器 I/O接口模块 DI | DO | AI | AO | HSC 中断信号 图例: 程序总线 数据总线 外设总线 桥接器 注:多总线架构可避免CPU取指令与读写数据时的总线冲突

你看这张图,CPU核心通过程序总线取指令,通过数据总线读写数据,两者互不干扰。外设则通过桥接器挂在独立的外设总线上。这种设计的好处是,CPU执行逻辑程序时,不会因为访问外设而卡住。

个人经验:我设计的一款中端PLC芯片,用了双总线架构。程序总线是32位宽,数据总线是16位宽。为什么这么配?因为PLC指令大部分是32位的,而数据操作大多是16位的。这样既保证了取指令速度,又节省了芯片面积。

2.5 硬件架构设计的几个关键点

总结一下,设计PLC芯片硬件架构时,有几个地方要特别注意:

  • 扫描周期确定性:所有硬件模块的延迟必须是可预测的。别用动态缓存、乱序执行这些花哨功能。
  • 内存保护:用户程序不能访问系统固件区。我见过一个设计,用户程序写坏了Bootloader,导致芯片变砖。
  • I/O隔离:物理I/O和内部逻辑之间必须有电气隔离。光耦、TVS管、共模扼流圈,该加就加。
  • 总线仲裁:多主设备访问总线时,要有明确的优先级策略。一般CPU优先级最高,DMA次之。

曾经踩过的坑:我设计第一版PLC芯片时,把输入映像区和输出映像区放在同一个SRAM里。结果发现,当CPU写输出映像区时,如果同时有DMA在读取输入映像区,就会产生总线冲突。后来我把它们分到两个独立的SRAM块里,问题才解决。

好了,这一章的内容就这些。硬件架构是PLC芯片的根基,基础打好了,后面的逻辑扫描引擎才能跑得稳。你想想看,如果硬件设计有缺陷,软件再怎么优化也白搭。

专注资料整理