WinCC脚本双语法实战手册:C/VBS弹窗与输入框对照指南
在工业自动化项目中,WinCC作为监控系统的核心平台,其脚本功能是实现复杂逻辑的关键工具。但对于刚接触WinCC脚本开发的工程师来说,最头疼的莫过于在C脚本和VBScript两种语法之间频繁切换时的手忙脚乱——明明在VBS中得心应手的MsgBox,换成C脚本却要重新查文档;看似简单的输入框,两种语言的参数传递方式又截然不同。这份手册正是为解决这种"语法分裂症"而生。
不同于官方文档的按语言分类,我们采用 功能对照 的编排方式,将实际开发中最常用的弹窗确认、消息提示、数据输入三大场景,以左右并排的形式展示C/VBS实现差异。每个示例都附带参数速查表和常见陷阱提示,就像有位经验丰富的同事在代码旁写下批注。无论是应急查阅还是系统学习,这份手册都能让你少走弯路。
1. 消息弹窗:从基础到高级配置
1.1 基础消息提示框
C脚本实现 :
// 显示简单OK对话框
MessageBox(NULL, "设备温度超过阈值!", "报警提示", MB_OK);
VBScript实现 :
MsgBox "设备温度超过阈值!", vbOKOnly, "报警提示"
关键参数对照表 :
| 功能描述 | C脚本参数 | VBScript参数 | 备注 |
|---|---|---|---|
| 只显示OK按钮 | MB_OK | vbOKOnly | 默认配置 |
| 标题文本 | 第三个字符串参数 | 第三个参数 | VBS中标题为可选参数 |
| 模态类型 | MB_SYSTEMMODAL | 无等效参数 | C脚本独有系统模态选项 |
注意:VBScript中按钮类型参数实际是数值常量,vbOKOnly对应值为0,但建议始终使用常量名保证可读性
1.2 带确认选项的对话框
当需要用户做出选择时,按钮组合和返回值处理是重点差异所在:
C脚本实现 :
int result = MessageBox(
NULL,
"是否保存当前配置?",
"系统提示",
MB_YESNOCANCEL | MB_ICONQUESTION
);
if (result == IDYES) {
// 保存操作
} else if (result == IDNO) {
// 跳过保存
} else {
// 取消操作
}
VBScript实现 :
answer = MsgBox("是否保存当前配置?", vbYesNoCancel + vbQuestion, "系统提示")
Select Case answer
Case vbYes
' 保存操作
Case vbNo
' 跳过保存
Case vbCancel
' 取消操作
End Select
返回值对照速查 :
-
C脚本返回值:
-
IDYES→ 用户点击"是" -
IDNO→ 用户点击"否" -
IDCANCEL→ 用户点击"取消"
-
-
VBScript返回值:
-
vbYes→ 数值6 -
vbNo→ 数值7 -
vbCancel→ 数值2
-
2. 输入数据采集实战
2.1 基础文本输入框
C脚本实现 : WinCC的C脚本没有内置输入框函数,需要借助以下两种方式之一:
- 使用标准Windows API(需声明函数):
#include <apdefap.h>
char input[256];
GetText(NULL, "请输入IP地址:", "配置输入", input, 256);
- 使用WinCC内部函数(推荐):
char* input = GetTagCharWait("##TextInput::Enter value");
VBScript实现 :
Dim userInput
userInput = InputBox("请输入IP地址:", "配置输入", "192.168.1.1")
重要差异说明 :
- VBScript的InputBox是语言原生支持,而C脚本需要额外函数
- VBScript可直接设置默认值(第三个参数),C脚本需要手动初始化缓冲区
- C脚本的GetTagCharWait会阻塞执行直到用户输入,适合关键参数采集
2.2 带验证的数值输入
VBScript实现(带循环验证) :
Do
temp = InputBox("请输入温度值(0-100):", "参数设置")
If IsNumeric(temp) Then
If temp >= 0 And temp <= 100 Then Exit Do
End If
MsgBox "输入无效,请重新输入!", vbExclamation
Loop While True
C脚本等效实现 :
float value = 0;
char buffer[256];
while(1) {
GetText(NULL, "请输入温度值(0-100):", "参数设置", buffer, 256);
value = atof(buffer);
if(value >= 0 && value <= 100) break;
MessageBox(NULL, "输入无效,请重新输入!", "错误", MB_OK|MB_ICONWARNING);
}
3. 高级弹窗定制技巧
3.1 设置自定义图标
C脚本图标选项 :
// 警告图标
MessageBox(NULL, "压力过高!", "报警", MB_OK|MB_ICONWARNING);
// 信息图标
MessageBox(NULL, "保存成功", "提示", MB_OK|MB_ICONINFORMATION);
VBScript图标选项 :
' 错误图标
MsgBox "操作失败!", vbOKOnly + vbCritical, "错误"
' 询问图标
MsgBox "继续执行?", vbYesNo + vbQuestion, "确认"
图标常量对照表 :
| 图标类型 | C脚本参数 | VBScript参数 | 实际值 |
|---|---|---|---|
| 停止/错误 | MB_ICONSTOP | vbCritical | 16 |
| 问号 | MB_ICONQUESTION | vbQuestion | 32 |
| 感叹号 | MB_ICONEXCLAMATION | vbExclamation | 48 |
| 信息 | MB_ICONINFORMATION | vbInformation | 64 |
3.2 多语言支持方案
C脚本动态文本示例 :
char* titles[2] = {"Confirm", "确认"};
char* messages[2] = {"Save changes?", "是否保存修改?"};
int lang = GetLanguage(); // 假设获取当前语言索引
MessageBox(NULL, messages[lang], titles[lang], MB_YESNO);
VBScript动态文本示例 :
Dim langDict
Set langDict = CreateObject("Scripting.Dictionary")
langDict.Add "en", Array("Confirm", "Save changes?")
langDict.Add "zh", Array("确认", "是否保存修改?")
currentLang = "zh" ' 实际应从系统配置读取
MsgBox langDict(currentLang)(1), vbYesNo, langDict(currentLang)(0)
4. 调试与异常处理
4.1 脚本错误捕获
VBScript错误处理 :
On Error Resume Next
userInput = InputBox("请输入:", "配置")
If Err.Number <> 0 Then
Log "输入框错误: " & Err.Description
Exit Sub
End If
C脚本错误检查 :
char input[256];
if(GetText(NULL, "请输入:", "配置", input, 256) == 0) {
printf("MSG", "输入操作被用户取消");
return;
}
4.2 日志输出技巧
C脚本调试输出 :
// 输出到WinCC诊断窗口
printf("DEBUG", "用户选择: %d", result);
// 写入文本日志
FILE* log = fopen("script.log", "a");
fprintf(log, "[%s] 操作已确认\n", GetTime());
fclose(log);
VBScript日志记录 :
Sub WriteLog(message)
Dim fso, file
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile("script.log", 8, True) ' 8=追加模式
file.WriteLine Now & " - " & message
file.Close
End Sub
WriteLog "用户点击了确认按钮"
1606

被折叠的 条评论
为什么被折叠?



