找回密码
 立即注册
查看: 39|回复: 0

简易型 PLC 实验

[复制链接]

14

主题

54

回帖

866

积分

高级会员

积分
866
发表于 昨天 21:09 | 显示全部楼层 |阅读模式

论坛上有PLC相关的贴子,但我看了,感觉都做得太高大上了,有点浪费啊,
本身就是想着省钱和省学习成本,搞到和真的PLC一样就和初衷相异了。
工厂里好多自动和半自动的设备,好多就3-5个输入,3-5个输出,且非常简单,
但设备不便宜,每次要调参数要叫厂家来,车马费是少不了的,且时间上不好控制。

我就想能不能做不个简单的标准“工控板”,再做一个简单的上位机。
这样简单明了,产线的技术员都可以随时根据机器调整相关参数。


大佬们认为可行吗?


Ai8051U-32Bit 简易 PLC 项目 使用与说明文档
一、项目概述
本项目基于 STC Ai8051U-32Bit 单片机,实现一台简易 PLC(可编程逻辑控制器)。上位机通过 USB-HID 下发规则表,MCU 采集数字量/模拟量输入,按规则延时驱动输出,并实时上报状态变化。

核心特性:

8 路数字输入 + 7 路模拟输入 + 16 路输出
规则化控制:边沿触发 / 区间触发,独立延时(毫秒/秒/分钟三级单位)
双重校验(包级 CRC8 + 表级累加和),数据安全可靠
变化主动上报 + 10 秒心跳,实时监控
上位机 C# WinForms,纯 Win32 API 访问 HID,无第三方依赖
二、硬件资源分配
2.1 输入
类型        引脚        说明
数字输入        P1.0 ~ P1.7        准双向口,检测上升/下降/任意变化
模拟输入        P0.0 ~ P0.6        ADC 通道 8~14,高阻输入,区间触发
内部校准        ADC 通道 15        内部 1.19V 基准,反推 AVcc 做精度补偿
2.2 输出(推挽,外部经三极管/光耦隔离)
通道号        引脚        模式配置
0 ~ 7        P2.0 ~ P2.7        推挽输出
8 ~ 14        P4.0 ~ P4.6        推挽输出(P4.7 不用,保持高阻)
15        P3.5        推挽输出
上电初值全部为高电平(继电器不动作)。

2.3 其他资源
资源        用途
T0(12T,16位自动重载)        产生 1ms 系统节拍,规则延时计时
P3.0 / P3.1        USB D- / D+,不可接其它电路
系统时钟        24MHz,须与 ISP 下载设置一致
三、功能说明
3.1 规则模型
每条规则 12 字节,结构如下:

字节        字段        取值
+0        src_type        0=数字输入,1=模拟输入
+1        src_ch        数字 0~7→P1.x;模拟 8~14→P0.0~P0.6
+2        trig_mode        0=上升(低变高),1=下降(高变低),2=任意变化
+3~4        th_low_mv        模拟触发下限 mV(低字节在前)
+5~6        th_high_mv        模拟触发上限 mV(低字节在前)
+7        out_ch        0~7→P2.x,8~14→P4.x,15→P3.5
+8        act_level        0=置低,1=置高
+9~10        delay_val        延时值(低字节在前)
+11        time_unit        0=毫秒,1=秒,2=分钟
延时能力:delay_val 最大 65535;毫秒模式最长 65 秒,秒模式最长约 18 小时,分钟模式最长约 45 天。

3.2 规则约束
唯一性:同一(输入 + 输出)组合只能有一条规则。下发重复时,后者覆盖前者。
扇出限制:1 个数字输入最多关联 4 条输出规则。
模拟通道:建议一路模拟输入只对应一条规则,避免区间上报重复(上位机会提示)。
3.3 触发逻辑
数字输入:检测到符合 trig_mode 的电平变化 → 启动延时 → 延时到 → 按 act_level 驱动输出。
模拟输入:电压进入 [下限, 上限] 区间 → 上报"进入" + 启动延时;离开区间 → 上报"离开"。
3.4 主动上报
包类型        首字节        说明
事件包        0x81        [1]=类型,[2]=通道,[3~4]=数值,[63]=CRC8
心跳包        0x82        [1~2]=系统毫秒低16位,[63]=CRC8,每 10 秒一次
事件类型:1=数字输入变化,2=输出变化,3=模拟进入区间,4=模拟离开区间。

四、通信协议
每包固定 64 字节。

4.1 命令表
命令        方向        内容        应答
0x01        PC→MCU        [1]=总条数        无
0x02        PC→MCU        [1]=包序号,[2~61]=最多5条规则,[62]=CRC8([0~61])        无(静默接收)
0x03        PC→MCU        [1]=总条数,[2]=12×N 累加和低8位        0xA5 生效 / 0x5A 失败
0x04        PC→MCU        无        0xA4 + 状态数据
0x05        PC→MCU        无        无(输出全复位)
0x06        PC→MCU        无        无(停止所有计时)
4.2 校验机制
层级        方法        失败处理
包级(0x02)        CRC8(多项式 0x07,初值 0,不反转),覆盖 [0~61]        整包丢弃,不写入规则表
表级(0x03)        总条数比对 + 12×N 字节累加和(低8位)+ 约束检查        回 0x5A,清空整表
应答包        整包 CRC8([63] 字节)        上位机丢弃异常应答
4.3 状态回传(0x04,回复 64 字节)
偏移        内容
[0]        0xA4 应答标识
[1]        有效规则数
[2]        已接收规则数
[3]        P1 数字输入电平(bit0~7 = P1.0~P1.7)
[4]        P2 输出实际电平
[5]        P4.0~P4.6 输出电平
[6]        bit0 = P3.5 输出电平
[7~10]        规则计时状态位图(32 位)
[11~24]        7 路 ADC 电压 mV(每路 2 字节,低字节在前)
[25~26]        AVcc 推算值 mV
[63]        整包 CRC8
五、工程建立与烧录
5.1 MCU 侧(Keil C251)
新建工程,器件选择 Ai8051U-32Bit;
将 stc_usb_hid_32g.LIB 与 stc_usb_hid.h 复制到工程目录,.LIB 添加到工程;
把 main.c 加入工程编译;
使用 ISP 工具下载,IRC 频率必须设为 24MHz;
下载时确认 USB 线仅连接 P3.0/P3.1,无其它电路干扰。
5.2 上位机侧(Visual Studio / .NET Framework)
新建 WinForms 项目;
加入 HidDevice.cs、PlcProtocol.cs、Form1.cs;
按实际固件修改 Form1.cs 中的 VID / PID;
编译运行。
六、操作步骤
6.1 首次连接
单片机上电,用 USB 线连接 PC;
打开上位机,点击「连接设备」;
状态栏显示 已连接 VID=... PID=... 即成功;
若提示"未找到设备",检查 VID/PID 是否与固件一致、USB 线是否只连 P3.0/P3.1。
6.2 编辑与下发规则
在表格中勾选"启用"列(未勾选的行不下发);
逐行选择:源类型、源通道、触发方式、上下限、输出通道、动作电平、延时值、单位;
点击「下发规则表」;
日志显示"下发成功,N 条规则已生效"即完成;
若显示失败,检查是否条数超限、校验不符、或存在同输入同输出冲突。
6.3 查看状态
自动刷新:每 200ms 自动读回一次,界面顶部实时显示 P1 输入、16 路输出电平、7 路 ADC 电压、AVcc;
手动读回:点击「读回状态」,日志额外显示规则数与接收数;
心跳:收到 0x82 后显示"心跳: 正常",每 10 秒刷新。
6.4 紧急操作
按钮        作用
输出全复位        所有输出立即置高(发 0x05)
停止所有计时        取消所有正在计时的规则(发 0x06)
6.5 事件日志
P1.x 变高/低:数字输入电平变化;
P2.x/P4.x/P3.5 变高/低:输出电平变化;
AD P0.x 进入/离开区间 xxx mV:模拟量进/出触发区间。
七、注意事项
7.1 硬件
P3.0/P3.1 为 USB 专用,不可接 LED、按键等,否则影响下载与通信;
ADC 输入口必须设为高阻输入,本项目已在 Io_Init 中配置 P0M1=0xFF;
ADC 电源打开后需等待约 1ms 稳定,本项目已等待 2ms;
P4.7 上电有约 6.5ms 高电平,本项目不使用,保持高阻;
I/O 总灌/拉电流不超过 60mA,输出务必经三极管/光耦隔离;
建议在电源端加防反接与自我保护电路。
7.2 软件
系统时钟必须为 24MHz,否则 1ms 节拍与延时全错;
trig_mode 编码三处必须一致:0=上升、1=下降、2=任意;
修改延时单位后,delay_val 上限仍为 65535,注意不要超出所选单位的能力;
规则表下发的顺序必须与上位机累加顺序一致(包序号递增、包内规则顺序),否则 0x03 校验失败;
若 MCU 回 0x5A,规则表已清空,需重新下发完整表。
7.3 常见问题
现象        可能原因        处理
连不上设备        VID/PID 不符        核对固件与上位机常量
连不上设备        USB 线接了其它器件        检查 P3.0/P3.1 连线
下发失败(0x5A)        条数不符/累加和不符/规则冲突        检查启用行、模拟通道重复、同输入同输出
状态读回超时        MCU 未运行/时钟不对        确认 24MHz、程序已下载
延时不准        时钟非 24MHz        重新设置 ISP 频率
ADC 数值异常        输入口非高阻        检查 P0M1 配置
八、文件清单
文件        说明
main.c        MCU 主程序(单文件,含 I/O、定时器、ADC、规则、上报、协议)
stc_usb_hid.h / stc_usb_hid_32g.LIB        STC 官方 USB-HID 库
HidDevice.cs        上位机底层 USB-HID 访问类(Win32 API)
PlcProtocol.cs        上位机协议层(CRC8、下发、读回、上报解析)
Form1.cs        上位机界面(规则编辑、状态显示、日志)
九、协议速查卡(下发一条规则示例)
场景:P1.0 上升沿 → 延时 2 秒 → P2.0 置低

规则 12 字节:

00 00 00 00 00 00 00 00 00 02 00 01
│  │  │  └─┬─┘ └─┬─┘ │  │  └─┬─┘ │
│  │  │    │     │   │  │    │   └ time_unit=1(秒)
│  │  │    │     │   │  │    └──── delay=0x0002=2
│  │  │    │     │   │  └───────── act_level=0(置低)
│  │  │    │     │   └──────────── out_ch=0(P2.0)
│  │  │    │     └──────────────── th_high=0 (数字输入不用)
│  │  │    └────────────────────── th_low=0  (数字输入不用)
│  │  └─────────────────────────── trig_mode=0(上升)
│  └────────────────────────────── src_ch=0(P1.0)
└───────────────────────────────── src_type=0(数字)

下发流程:

0x01 包:[1]=1
0x02 包:[1]=0,[2~13]=上面12字节,其余填0,[62]=CRC8
0x03 包:[1]=1,[2]=12字节累加和低8位
收到 0xA5 即生效
Form1.cs (20.84 KB, 下载次数: 0) HidDevice.cs (12.19 KB, 下载次数: 0)



main.c (19.15 KB, 下载次数: 0)

PlcProtocol.cs (8.32 KB, 下载次数: 0)




回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-14 08:40 , Processed in 0.066710 second(s), 44 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表