谁说工控PLC不能和单片机结合的?
很多工控工程师都说:
“工业现场从没见过PLC和单片机结合。”
这次先不争论,直接做个小实验。
我用的是:
- Siemens S7-200 SMART CR40

- 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与单片机之间的信号链路。

光耦隔离模块
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点亮
反过来:
CR40 Q1.5断开 → Arduino D2检测不到有效信号 → Arduino D10输出低电平 → LED熄灭

测试结果
测试结果如下:
| CR40 Q1.5 | Arduino D2 | Arduino D10 | LED |
|---|---|---|---|
| 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的工业控制信号,能否安全地交给单片机继续处理。
不过给人的感觉好像主控CR40没干活,干活的反而是辅助控制器arduino。下一次我会写一篇cr40+arduino控制直流电机。这样你会看到两个主控是怎么协同工作完成项目的。
注明:本项目有部分内容涉及到交流电。这个内容面向对象主要是有高低压电路知识和工控编程的人。例如装配电工,PLC接线工,PLC编程工程师,PLC机器视觉,工控机器人工程师。上位机工程师,MES工程师。不适合只有12V,5V电路知识的中小学生。




