PLC和单片机能结合吗?光耦隔离实验验证

2026-10-26 09:32:19 44阅读

谁说工控PLC不能和单片机结合的?

很多工控工程师都说:

"工业现场从没见过PLC和单片机结合。"

这次先不争论,直接做个小实验。

我用的是:

  • Siemens S7-200 SMART CR40

Siemens S7-200 SMART CR40 PLC

  • Arduino

Arduino开发板

  • 24V—3.3V光耦隔离模块
  • 5V-LED
  • Step 7 西门子编程软件

实验目标不是让Arduino自己点亮LED。

Arduino点亮LED当然不难,CR40直接控制指示灯也不难。真正要测试的是:

CR40输出的24V工业控制信号,能不能经过隔离后,让Arduino正确识别?

实验结构

CR40梯形图
  ↓
CR40继电器输出
  ↓ 24V信号
24V—3.3V光耦隔离模块
  ↓
Arduino数字输入
  ↓
Arduino数字输出
  ↓
LED

这次让CR40做主控制器,Arduino只负责接收信号并显示结果。

换句话说:

CR40决定LED什么时候亮;
Arduino负责把这个结果显示出来。

CR40梯形图控制

我在CR40中写了一段简单的梯形图,用输出点控制继电器。

测试时使用:

Q1.4 / DQb.4:控制24V喇叭
Q1.5 / DQb.5:输出给光耦模块

其中,Q1.5是这次LED测试使用的PLC输出点。

在Micro/WIN SMART的状态表中切换Q1.5:

Q1.5 = 0 → CR40输出关闭
Q1.5 = 1 → CR40输出接通

如果只是让LED亮起来,CR40完全可以自己完成,不需要Arduino。

所以这里故意把Arduino放在继电器输出后面,测试PLC与单片机之间的信号链路。

梯形图的M0.0常开触点 → PLC-LED-OUT为输出线圈。

也就是:

M0.0 = 1 → Q1.5接通
M0.0 = 0 → Q1.5断开

在梯形图中,常开触点只有在对应位为1时才导通,输出线圈则根据左侧逻辑结果接通或断开。

它的背后是 CPU_输出I3 地址:Q1.5 数据类型:BOOL

这几个字段分别是什么意思

字段含义
符号CPU_输出I3,PLC-LED-OUT(我随便起的名字)
地址Q1.5,PLC实际输出地址
类型BOOL,只有0或1两种状态

CR40状态表截图

梯形图程序截图

光耦隔离模块

CR40输出的是24V工业信号,Arduino的输入端不能直接接收24V。

因此中间加入:

24V—3.3V光耦隔离模块

连接关系如下:

CR40 Q1.5 → 光耦模块1+
CR40 M    → 光耦模块1-

Arduino侧:

光耦模块VCC → Arduino 3.3V
光耦模块GND → Arduino GND
光耦模块O1  → Arduino D2

光耦模块的作用是:

24V工业信号 → 电气隔离 → 3.3V逻辑信号

因此,不把CR40的24V直接接到Arduino的IO口。

Arduino程序

本次使用Arduino D2作为PLC信号输入,D10控制LED。

由于光耦模块输出为低电平有效,所以使用INPUT_PULLUP:

// 定义PLC信号输入引脚
// Arduino通过D2读取光耦隔离模块输出的信号
const int plcInput = 2;

// 定义LED输出引脚
// Arduino通过D10控制LED
const int ledPin = 10;

void setup() {
  // 将D2设置为带内部上拉电阻的数字输入
  // 光耦模块输出为低电平有效
  pinMode(plcInput, INPUT_PULLUP);

  // 将D10设置为数字输出
  // 用于控制LED的亮灭
  pinMode(ledPin, OUTPUT);

  // Arduino启动时先关闭LED
  // 避免上电瞬间LED误点亮
  digitalWrite(ledPin, LOW);
}

void loop() {
  // 读取PLC信号状态
  // 当D2读取到LOW时,表示光耦模块检测到PLC输出信号
  bool plcOn = (digitalRead(plcInput) == LOW);

  // 判断PLC信号是否有效
  if (plcOn) {
    // PLC输出有效
    // Arduino将D10设置为HIGH,点亮LED
    digitalWrite(ledPin, HIGH);
  } else {
    // PLC输出无效
    // Arduino将D10设置为LOW,关闭LED
    digitalWrite(ledPin, LOW);
  }

  // 延时10毫秒后再次读取PLC信号
  // 避免循环执行过快
  delay(10);
}

程序逻辑很简单:

CR40 Q1.5接通 → 光耦输出有效 → Arduino D2检测到低电平 → Arduino D10输出高电平 → LED点亮

LED点亮测试结果

反过来:

CR40 Q1.5断开 → Arduino D2检测不到有效信号 → Arduino D10输出低电平 → LED熄灭

测试结果

测试结果如下:

CR40 Q1.5Arduino D2Arduino D10LED
0无有效输入LOW熄灭
1检测到输入HIGH点亮

测试成功。

这条信号链路已经打通:

CR40梯形图 → CR40继电器输出 → 24V工业信号 → 光耦隔离 → Arduino输入 → Arduino输出 → LED

信号链路测试结果汇总

这次实验说明了什么?

这不是为了证明Arduino比PLC更强,也不是让Arduino替代CR40。

在这个实验里:

CR40:负责梯形图逻辑和主控制信号
光耦模块:负责24V与3.3V之间的隔离和转换
Arduino:负责接收PLC信号,并将结果输出到LED

如果任务只是控制一个LED,CR40自己就能完成。

所以这次LED的真正作用,是作为一个最直观的状态指示器,验证:

PLC的工业控制信号,能否安全地交给单片机继续处理。

PLC+Arduino信号链路图

不过给人的感觉好像主控CR40没干活,干活的反而是辅助控制器Arduino。下一次我会写一篇CR40+Arduino控制直流电机。这样你会看到两个主控是怎么协同工作完成项目的。

注明:本项目有部分内容涉及到交流电。这个内容面向对象主要是有高低压电路知识和工控编程的人。例如装配电工,PLC接线工,PLC编程工程师,PLC机器视觉,工控机器人工程师,上位机工程师,MES工程师。不适合只有12V、5V电路知识的中小学生。


作者:gada888
链接:https://www.aiddithome.com/p/1dae2b929956dc.html
本作遵循 [CC BY 4.0 署名] 许可,版权归作者所有。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
老张装机
1楼 · 2026-10-26 09:33:01

光耦隔离这个思路很实用,24V工业信号转3.3V给Arduino,安全又可靠

板砖搬不动
2楼 · 2026-10-26 09:33:01

PLC做主控制,单片机做信号处理,这种分工模式在工控现场其实很常见

参数党小马
3楼 · 2026-10-26 09:33:01

INPUT_PULLUP这个细节很关键,光耦输出低电平有效容易忽略

下班才有空
4楼 · 2026-10-26 09:33:01

期待下一篇CR40+Arduino控制直流电机的文章