1. 项目概述与背景
在工业自动化控制系统中,上位机与PLC的协同工作一直是核心环节。这次分享的项目是一个典型的工业数据采集与监控系统,主要实现三菱PLC控制、研华采集卡数据采集和上位机数据处理三大功能模块。系统采用C#开发,通过RS232串口与PLC通信,实时采集压装电压数据,并具备数据存储、曲线分析和历史查询等完整功能。
这个系统的特别之处在于采用了多线程架构,解决了传统单线程程序在同时处理串口通信、数据采集和数据库操作时的性能瓶颈问题。我在汽车零部件压装生产线中实际应用了这套系统,稳定运行超过2年,累计处理了超过500万条数据记录。
2. 硬件架构与通信设计
2.1 硬件组成与连接
系统硬件由三部分组成:
- 三菱FX3U系列PLC - 负责设备控制逻辑
- 研华USB-4716数据采集卡 - 8通道模拟量输入,16位分辨率
- 工控上位机 - 戴尔OptiPlex系列,Windows 10系统
连接方式采用星型拓扑:
- PLC通过RS232串口直连上位机
- 研华采集卡通过USB接口连接
- 压装设备的压力传感器信号接入采集卡CH0通道
注意:RS232通信距离建议不超过15米,超过此距离需考虑使用RS485转换器。实际布线时要远离变频器等干扰源。
2.2 串口通信协议实现
三菱PLC采用MC协议通信,具体实现要点:
csharp复制// 三菱PLC通信帧构造示例
byte[] BuildReadCommand(int startAddress, int length)
{
byte[] frame = new byte[11];
frame[0] = 0x02; // STX
frame[1] = 0x30; // 读命令
// 地址转换(大端模式)
byte[] addrBytes = BitConverter.GetBytes(startAddress);
if (BitConverter.IsLittleEndian)
Array.Reverse(addrBytes);
Buffer.BlockCopy(addrBytes, 0, frame, 2, 4);
// 数据长度
byte[] lenBytes = BitConverter.GetBytes(length);
if (BitConverter.IsLittleEndian)
Array.Reverse(lenBytes);
Buffer.BlockCopy(lenBytes, 0, frame, 6, 2);
frame[10] = 0x03; // ETX
return frame;
}
通信参数配置要点:
- 波特率:19200(工业环境推荐值)
- 数据位:7位
- 停止位:1位
- 奇偶校验:偶校验
- 流控制:None
实测中发现,三菱PLC对通信间隔敏感,连续发送指令需保持5ms以上间隔,否则可能丢失数据包。
3. 数据采集模块实现
3.1 研华采集卡配置
研华USB-4716采集卡的主要参数配置:
csharp复制Advantech.Adam.Adam4000Config config = new Adam4000Config()
{
ChannelMode = ChannelMode.SingleEnded,
InputRange = InputRange.±10V,
SampleRate = 1000, // 1kHz采样率
BufferSize = 1024 // 环形缓冲区大小
};
using (AdamDevice device = new AdamDevice(1))
{
device.Configure(config);
device.Calibrate(); // 上电自动校准
// 启动采集线程
device.StartAcquisition();
}
关键参数选择依据:
- ±10V量程:覆盖压力传感器0-5V输出范围
- 1kHz采样率:满足压装过程100ms内动态响应需求
- 单端输入:简化接线,抗干扰要求
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容