You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TwinCAT 3 HMI实现CSV文件选择对话框及配方加载方案问询

解决方案:HMI中实现CSV文件选择与数组加载

一、西门子WinCC(TIA Portal)实现方案

WinCC可通过VBS脚本调用系统文件对话框,读取CSV内容到内部数组:

  1. 按钮绑定文件选择脚本
    在HMI画面添加按钮,关联以下VBS脚本:
Sub OnClick(Byval Item)
    Dim fd, filePath
    Set fd = CreateObject("MSComDlg.CommonDialog")
    
    ' 设置CSV文件过滤规则
    fd.Filter = "CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*"
    fd.FilterIndex = 1
    
    ' 弹出文件选择对话框
    If fd.ShowOpen = 1 Then
        filePath = fd.FileName
        ReadCSVToArray filePath
    End If
End Sub
  1. CSV读取转数组函数
Sub ReadCSVToArray(filePath)
    Dim fso, file, line, arrLines, rowIndex, colIndex
    ' 定义二维数组,根据实际配方规模调整维度
    Dim recipeArray(100, 10)
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.OpenTextFile(filePath, 1) ' 只读模式打开
    
    rowIndex = 0
    Do Until file.AtEndOfStream
        line = file.ReadLine
        arrLines = Split(line, ",") ' 按逗号分割每行数据
        
        ' 将分割后的数据写入数组
        For colIndex = 0 To UBound(arrLines)
            If colIndex <= UBound(recipeArray, 2) Then
                recipeArray(rowIndex, colIndex) = arrLines(colIndex)
            End If
        Next
        
        rowIndex = rowIndex + 1
        If rowIndex >= UBound(recipeArray, 1) Then Exit Do ' 防止数组越界
    Loop
    
    file.Close
    Set file = Nothing
    Set fso = Nothing
    
    ' 此处可添加数组数据同步到HMI变量的逻辑
    ' 示例:HMIRuntime.Tags("RecipeTotalRows").Write rowIndex
End Sub

二、三菱GT Designer3/GT Works3实现方案

三菱HMI通过ST脚本调用系统API实现文件选择与CSV读取:

  1. 按钮触发文件选择
    在按钮按下时事件中添加ST脚本:
PROGRAM CSV_Select
VAR
    hWnd: DWORD;
    FilePath: STRING[256];
    SelectResult: BOOL;
END_VAR

' 获取HMI窗口句柄
hWnd := DspGetWindowHandle();
' 弹出文件选择对话框,过滤CSV文件
SelectResult := FileOpenDialog(hWnd, '选择配方CSV文件', '', 'CSV文件(*.csv)|*.csv', FilePath);

IF SelectResult THEN
    CSV_Read(FilePath);
END_IF
  1. CSV转数组函数块
FUNCTION_BLOCK CSV_Read
VAR_INPUT
    FilePath: STRING[256];
END_VAR
VAR
    FileHandle: DWORD;
    ReadBuffer: STRING[1024];
    LineIndex: INT := 0;
    ColIndex: INT := 0;
    ' 按需调整数组维度
    RecipeArray: ARRAY[0..99, 0..9] OF STRING[32];
    TempStr: STRING[32];
    CharPos: INT;
END_VAR

' 打开CSV文件
FileHandle := FileOpen(FilePath, FILE_OPEN_MODE_READ);
IF FileHandle <> 0 THEN
    WHILE FileReadLine(FileHandle, ReadBuffer) = 0 DO ' 逐行读取
        ColIndex := 0;
        TempStr := '';
        CharPos := 1;
        
        ' 分割逗号分隔的字段
        WHILE CharPos <= LEN(ReadBuffer) DO
            IF MID(ReadBuffer, CharPos, 1) = ',' THEN
                RecipeArray[LineIndex, ColIndex] := TempStr;
                TempStr := '';
                ColIndex := ColIndex + 1;
            ELSE
                TempStr := TempStr + MID(ReadBuffer, CharPos, 1);
            END_IF
            CharPos := CharPos + 1;
        END_WHILE
        ' 写入最后一列数据
        IF ColIndex <= UPPER_BOUND(RecipeArray, 2) THEN
            RecipeArray[LineIndex, ColIndex] := TempStr;
        END_IF
        
        LineIndex := LineIndex + 1;
        IF LineIndex >= UPPER_BOUND(RecipeArray, 1) THEN EXIT; END_IF
    END_WHILE
    FileClose(FileHandle);
END_IF
END_FUNCTION_BLOCK

三、PC-based自定义HMI(Qt示例)

基于PC的HMI可直接调用系统文件对话框,以Qt为例:

  1. 文件选择对话框实现
    在按钮点击槽函数中添加:
void MainWindow::on_selectCsvBtn_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this, tr("选择配方CSV"), "", tr("CSV Files (*.csv);;All Files (*)"));
    if (!filePath.isEmpty()) {
        readCsvToArray(filePath);
    }
}
  1. CSV读取到动态数组
void MainWindow::readCsvToArray(const QString &filePath)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        return;
    }
    
    QVector<QVector<QString>> recipeArray;
    QTextStream in(&file);
    
    while (!in.atEnd()) {
        QString line = in.readLine();
        QStringList fields = line.split(",", Qt::SkipEmptyParts);
        recipeArray.append(QVector<QString>::fromList(fields));
    }
    
    file.close();
    
    // 后续可将数组数据同步到HMI界面控件或内部变量
}

关键注意事项

  • 数组边界控制:根据配方最大行数/列数定义数组,避免越界报错
  • CSV格式兼容:确保CSV使用逗号作为分隔符,若存在带逗号的字段,需额外处理引号包裹的内容
  • 权限配置:工业HMI需在项目配置中开启文件系统访问权限,确保运行时能读取目标文件夹

内容的提问来源于stack exchange,提问作者Johan Ivarsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:20:27