三菱PLC、研华采集卡与串口上位机多线程开发实战

张开发
2026/4/9 21:57:58 15 分钟阅读

分享文章

三菱PLC、研华采集卡与串口上位机多线程开发实战
多线程源码_三菱plc卡串口上位机 1, 采用C#编程。 2, 上位机采用RS232串口通信链接plc。 3, PLC为三菱。 4, 研华采集卡采集压装电压。 5, 曲线判据自定义。 6, 每天作业自动生成数据库文件按日期区分。 7, 可查看历史曲线。 8, 按不同查询条件查询数据导出数据。在工业自动化领域上位机与PLC以及各类采集卡的协同工作是实现高效生产与精准监控的关键。今天就来聊聊基于C#开发的多线程应用涉及三菱PLC、研华采集卡以及串口上位机的项目实践。串口通信与PLC交互上位机采用RS232串口通信链接三菱PLC。在C#中System.IO.Ports命名空间为串口通信提供了便利。using System.IO.Ports; // 初始化串口 SerialPort serialPort new SerialPort(COM1, 9600, Parity.None, 8, StopBits.One); if (!serialPort.IsOpen) { try { serialPort.Open(); } catch (Exception ex) { Console.WriteLine(串口打开失败: ex.Message); } }上述代码中我们实例化了一个SerialPort对象设置了串口号为COM1波特率9600无奇偶校验8位数据位1位停止位。接着尝试打开串口并捕获可能出现的异常。与三菱PLC通信时需遵循其特定的通信协议比如可能要按照特定格式打包和解包数据。研华采集卡采集压装电压研华采集卡用于采集压装电压通常研华会提供相应的SDK供我们调用。假设SDK提供了一个采集方法AcquireVoltage。// 引用研华采集卡SDK相关命名空间 using Advantech.Adam; public double GetVoltage() { AdamDevice device new AdamDevice(1); // 假设设备号为1 try { return device.AcquireVoltage(0); // 从通道0采集电压 } catch (Exception ex) { Console.WriteLine(采集电压失败: ex.Message); return 0; } }这段代码创建了一个研华设备对象并尝试从指定通道采集电压值。在实际应用中可能还需要进行设备初始化、校准等操作。多线程的运用考虑到串口通信、数据采集以及其他任务如数据库操作可能会阻塞主线程使用多线程能提升程序的响应性和效率。using System.Threading; Thread dataAcquisitionThread new Thread(() { while (true) { double voltage GetVoltage(); // 将采集到的电压数据进行处理比如发送给PLC或者存储到数据库 Thread.Sleep(1000); // 每1秒采集一次 } }); dataAcquisitionThread.Start();上述代码创建了一个新线程用于数据采集在线程函数中不断采集电压数据并每秒采集一次。当然实际应用中可能需要更复杂的逻辑比如根据采集频率动态调整采集时间间隔。曲线判据自定义曲线判据自定义意味着我们可以根据业务需求来判断采集到的数据曲线是否符合要求。// 假设已有一个Listdouble存储采集到的电压数据 Listdouble voltageList new Listdouble(); public bool CheckCurve() { // 简单示例判断曲线是否单调递增 for (int i 1; i voltageList.Count; i) { if (voltageList[i] voltageList[i - 1]) { return false; } } return true; }上述代码简单实现了判断采集数据曲线是否单调递增的功能实际业务中可能会有更复杂的判据比如判断曲线斜率是否在某个范围内等。数据库操作每天作业自动生成数据库文件按日期区分这里我们可以使用SQLite来实现轻量级的数据库操作。using System.Data.SQLite; string date DateTime.Now.ToString(yyyyMMdd); string connectionString $Data Sourcedatabase_{date}.db;Version3;; using (SQLiteConnection connection new SQLiteConnection(connectionString)) { connection.Open(); string createTableQuery CREATE TABLE IF NOT EXISTS VoltageData (Id INTEGER PRIMARY KEY AUTOINCREMENT, Voltage REAL, Timestamp DATETIME); using (SQLiteCommand command new SQLiteCommand(createTableQuery, connection)) { command.ExecuteNonQuery(); } }上述代码根据当前日期生成数据库文件名并创建一个用于存储电压数据的表。每次采集到数据后就可以将数据插入到这个表中。查看历史曲线与数据查询导出查看历史曲线需要从数据库中读取数据而按不同查询条件查询数据导出数据则需要构建相应的SQL查询语句。// 查询某段时间内的电压数据 string startDate 2023 - 01 - 01; string endDate 2023 - 01 - 31; string query $SELECT Voltage, Timestamp FROM VoltageData WHERE Timestamp BETWEEN {startDate} AND {endDate}; using (SQLiteConnection connection new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteCommand command new SQLiteCommand(query, connection)) { using (SQLiteDataReader reader command.ExecuteReader()) { while (reader.Read()) { double voltage reader.GetDouble(0); DateTime timestamp reader.GetDateTime(1); // 这里可以将数据用于绘制历史曲线或者导出 } } } }上述代码实现了查询指定时间段内电压数据的功能获取到的数据可以用于绘制历史曲线或者按照特定格式导出。多线程源码_三菱plc卡串口上位机 1, 采用C#编程。 2, 上位机采用RS232串口通信链接plc。 3, PLC为三菱。 4, 研华采集卡采集压装电压。 5, 曲线判据自定义。 6, 每天作业自动生成数据库文件按日期区分。 7, 可查看历史曲线。 8, 按不同查询条件查询数据导出数据。通过这些功能的实现我们就构建了一个功能较为完善的基于三菱PLC、研华采集卡和串口上位机的多线程应用系统在工业自动化场景中能够有效实现数据采集、处理、存储与分析。

更多文章