TwinCAT 3 HMI实现CSV文件选择对话框及配方加载方案问询
解决方案:HMI中实现CSV文件选择与数组加载
一、西门子WinCC(TIA Portal)实现方案
WinCC可通过VBS脚本调用系统文件对话框,读取CSV内容到内部数组:
- 按钮绑定文件选择脚本
在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
- 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读取:
- 按钮触发文件选择
在按钮按下时事件中添加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
- 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为例:
- 文件选择对话框实现
在按钮点击槽函数中添加:
void MainWindow::on_selectCsvBtn_clicked() { QString filePath = QFileDialog::getOpenFileName(this, tr("选择配方CSV"), "", tr("CSV Files (*.csv);;All Files (*)")); if (!filePath.isEmpty()) { readCsvToArray(filePath); } }
- 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
相关产品推荐
相关产品推荐

