多线程源码_三菱plc+卡+串口上位机 1, 采用C#编程。 2, 上位机采用RS232串口通信链接plc。 3, PLC为三菱。 4, 研华采集卡,采集压装电压。 5, 曲线判据自定义。 6, 每天作业自动生成数据库文件,按日期区分。 7, 可查看历史曲线。 8, 按不同查询条件查询数据导出数据。

在工业自动化领域,上位机与PLC以及各类采集卡的协同工作是实现高效生产与精准监控的关键。今天就来聊聊基于C#开发的多线程应用,涉及三菱PLC、研华采集卡以及串口上位机的项目实践。
串口通信与PLC交互
上位机采用RS232串口通信链接三菱PLC。在C#中,System.IO.Ports命名空间为串口通信提供了便利。
csharp
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。
csharp
// 引用研华采集卡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;
}
}
这段代码创建了一个研华设备对象,并尝试从指定通道采集电压值。在实际应用中,可能还需要进行设备初始化、校准等操作。
多线程的运用
考虑到串口通信、数据采集以及其他任务(如数据库操作)可能会阻塞主线程,使用多线程能提升程序的响应性和效率。
csharp
using System.Threading;
Thread dataAcquisitionThread = new Thread(() =>
{
while (true)
{
double voltage = GetVoltage();
// 将采集到的电压数据进行处理,比如发送给PLC或者存储到数据库
Thread.Sleep(1000); // 每1秒采集一次
}
});
dataAcquisitionThread.Start();
上述代码创建了一个新线程用于数据采集,在线程函数中不断采集电压数据,并每秒采集一次。当然,实际应用中可能需要更复杂的逻辑,比如根据采集频率动态调整采集时间间隔。
曲线判据自定义
曲线判据自定义意味着我们可以根据业务需求来判断采集到的数据曲线是否符合要求。
csharp
// 假设已有一个List<double>存储采集到的电压数据
List<double> voltageList = new List<double>();
public bool CheckCurve()
{
// 简单示例:判断曲线是否单调递增
for (int i = 1; i < voltageList.Count; i++)
{
if (voltageList[i] <= voltageList[i - 1])
{
return false;
}
}
return true;
}
上述代码简单实现了判断采集数据曲线是否单调递增的功能,实际业务中可能会有更复杂的判据,比如判断曲线斜率是否在某个范围内等。
数据库操作
每天作业自动生成数据库文件,按日期区分,这里我们可以使用SQLite来实现轻量级的数据库操作。
csharp
using System.Data.SQLite;
string date = DateTime.Now.ToString("yyyyMMdd");
string connectionString = $"Data Source=database_{date}.db;Version=3;";
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查询语句。
csharp
// 查询某段时间内的电压数据
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、研华采集卡和串口上位机的多线程应用系统,在工业自动化场景中能够有效实现数据采集、处理、存储与分析。