PLC+Arduino实战笔记(10):让Arduino LCD屏幕显示设备状态
第10课|Arduino屏幕显示设备状态:给PLC五件批次实验加一块LCD2004
第09课完成了五件批次控制实验,第10课继续沿用原来的控制流程,为设备增加一个屏幕显示端。
这一课不新增控制逻辑,而是把PLC内部的信息显示出来:设备正在做什么、当前计了多少件、是否已经完成一批,以及有没有报警。
本项目的分工是:**PLC负责控制和真实数据,Arduino负责读取与显示。**

## 一、项目目标
原来的实验主要通过按钮、传感器和指示灯观察设备运行。增加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显示
```屏幕是观察窗口,不参与启动、停止、报警复位等控制决策。

## 三、沿用第09课,不让Arduino另算一套计数
本课最重要的设计原则,是保持数据来源一致。
PLC中的计数器C0负责记录实际计数。Arduino读取PLC输出的计数编码,再把结果显示到屏幕上。
不采用下面这种方式:
```
Arduino自己数传感器脉冲
→ 推算PLC计了多少件
→ 把推算结果当作PLC实际计数
```否则PLC发生复位、批次清零或计数条件变化时,屏幕就可能和控制程序不一致。
正确关系是:
```
PLC产生真实值
→ Arduino接收
→ 屏幕显示
```
## 四、先完成三路计数显示
本次先使用三路隔离信号,把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一直读到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`。
接下来继续完成计数全范围核对,再接入状态码,让这块屏幕从数字显示器,逐步成为五件批次实验的设备状态面板。




