PLC+Arduino实战笔记(10):让Arduino LCD屏幕显示设备状态

2026-10-315

第10课|Arduino屏幕显示设备状态:给PLC五件批次实验加一块LCD2004

 

第09课完成了五件批次控制实验,第10课继续沿用原来的控制流程,为设备增加一个屏幕显示端。

这一课不新增控制逻辑,而是把PLC内部的信息显示出来:设备正在做什么、当前计了多少件、是否已经完成一批,以及有没有报警。

本项目的分工是:**PLC负责控制和真实数据,Arduino负责读取与显示。**

 

PLC+Arduino实战笔记(10):让Arduino LCD屏幕显示设备状态_image_1.webp

## 一、项目目标

原来的实验主要通过按钮、传感器和指示灯观察设备运行。增加LCD2004后,希望能直接看到:


STATE: WAIT PART
COUNT: 3/5
```

屏幕不仅显示数字,还要让人知道这个数字对应什么运行状态。

计划显示的内容如下:

| 设备状态 | 屏幕英文标签 |
|---|---|
| 待机 | IDLE |
| 启动准备 | PREP |
| 等待物体 | WAIT PART |
| 运行中 | RUN |
| 批次完成 | BATCH DONE |
| 等待超时报警 | FAULT E01 |

先使用英文短标签,把信号读取和显示流程做好,不在这一课同时增加中文字库等任务。

 

## 二、硬件组成

本次项目使用:

- 西门子S7-200 SMART CPU CR40;
- 隔离模块;
- Arduino开发板;
- LCD2004字符液晶;
- 第09课已有的按钮、传感器和指示灯。

整体结构:

```
按钮、传感器
     ↓
PLC五件批次控制程序
     ↓
状态码/计数编码输出
     ↓
隔离模块
     ↓
Arduino读取与解码
     ↓
LCD2004显示
```

屏幕是观察窗口,不参与启动、停止、报警复位等控制决策。

PLC+Arduino实战笔记(10):让Arduino LCD屏幕显示设备状态_image_2.webp

## 三、沿用第09课,不让Arduino另算一套计数

本课最重要的设计原则,是保持数据来源一致。

PLC中的计数器C0负责记录实际计数。Arduino读取PLC输出的计数编码,再把结果显示到屏幕上。

不采用下面这种方式:

```
Arduino自己数传感器脉冲
→ 推算PLC计了多少件
→ 把推算结果当作PLC实际计数
```

否则PLC发生复位、批次清零或计数条件变化时,屏幕就可能和控制程序不一致。

正确关系是:

```
PLC产生真实值
→ Arduino接收
→ 屏幕显示
```
PLC+Arduino实战笔记(10):让Arduino LCD屏幕显示设备状态_image_3.webp

## 四、先完成三路计数显示

本次先使用三路隔离信号,把PLC计数编码送到Arduino。

当前接线对应关系:

| PLC输出 | 隔离模块 | Arduino引脚 | 编码权重 |
|---|---|---|---|
| Q1.0 | 第2路/O2 | D2 | 1 |
| Q1.1 | 第3路/O3 | D3 | 2 |
| Q1.2 | 第4路/O4 | D4 | 4 |

Arduino程序保留两类信息:

```
RAW:引脚实际读取的电平
decoded:按极性和位序解码后的数值
```

这样既能给液晶提供显示数据,也方便区分“线路没有传来信号”和“解码方式不正确”。

 

## 五、当前已经跑通的结果

这次调试最终得到的串口输出是:

```
Q1.0 -> O2 -> D2
Q1.1 -> O3 -> D3
Q1.2 -> O4 -> D4
Decode: active LOW
RAW D4D3D2=010  decoded=5
```

与此同时:

- 隔离模块第2路、第4路LED亮;
- Arduino解码结果为5;
- LCD2004显示`Count: 5`。

按当前低电平有效设置:

```
原始电平:010
逻辑编码:101
显示数值:5
```

这意味着当前这一组信号已经完成了从PLC输出、经过隔离接口、到Arduino读取和液晶显示的完整链路。

这里也保留一个阶段边界:显示出5,证明了当前编码的读取与显示正确;要确认整个计数功能完成,还需要逐项核对PLC的C0与屏幕显示。

PLC+Arduino实战笔记(10):让Arduino LCD屏幕显示设备状态_image_4.webp

## 六、调试中最有价值的一点

本次遇到的主要问题是:

```
PLC输出灯亮
但隔离模块不响应
Arduino一直读到111
```

排查后,重点落在CR40继电器输出组的负载供电,以及隔离模块输出侧到Arduino的连接。

这次让我记住了:

> 程序里的输出ON、PLC指示灯亮、外部模块得到有效信号,是三个需要分别验证的环节。

因此,调试时按信号链路逐层检查,比直接反复修改Arduino计数公式更有效。

涉及24V输入、继电器公共端和隔离模块接线时,必须核对硬件规格,断电改线,不能把PLC的24V直接接到Arduino数字引脚。

 

## 七、下一步加入设备状态显示

计数链路跑通后,下一阶段把设备状态送到屏幕。

PLC侧计划使用状态码统一描述运行阶段:

| 状态码 | 含义 | 显示标签 |
|---:|---|---|
| 0 | 待机 | IDLE |
| 1 | 准备 | PREP |
| 2 | 等待物体 | WAIT PART |
| 3 | 运行 | RUN |
| 4 | 批次完成 | BATCH DONE |
| 5 | 报警 | FAULT E01 |

状态由PLC判断,Arduino只负责把状态码转换成文字。

如果通过独立的离散信号同时传递状态和计数,计划各使用三路:

```
3路:状态码
3路:计数值
```

实际分配前先核对输出和隔离通道是否空闲,不改动原来已有的控制用途。当前三路计数接线保持不变,状态显示作为下一步扩展,不把规划中的功能写成已经完成。

LCD2004的目标界面可以是:

```
PLC BATCH MONITOR
STATE: WAIT PART
COUNT: 3/5
```

 

## 八、完成标准

这一课的验收标准不是“屏幕点亮”,而是“屏幕显示与PLC在线监控一致”。

| 验收项目 | 当前进度 |
|---|---|
| Arduino读取三路计数编码 | 当前编码已跑通 |
| LCD2004显示Count: 5 | 已完成 |
| C0从0到5与显示逐项一致 | 待验证 |
| 批次清零后显示回到0 | 待验证 |
| 待机、准备、等待、运行状态显示 | 下一阶段 |
| 批次完成、超时报警显示 | 下一阶段 |
| 显示端不新增控制流程 | 本课设计原则 |

 

## 九、项目小结

第09课解决“让设备按流程动作”,第10课进一步解决“让人看懂设备正在做什么”。

这次已经完成了计数显示链路的阶段性验证:隔离模块有响应,Arduino读到正确编码,LCD2004成功显示`Count: 5`。

接下来继续完成计数全范围核对,再接入状态码,让这块屏幕从数字显示器,逐步成为五件批次实验的设备状态面板。

创作许可协议

本项目采用 CC BY(署名) 进行许可。

评论(0)
- 没有更多了 -