背景:PLC这边有四个一维数组,每个都是40个元素,0`39,导入到wincc这边就是一个又一个的变量
通过以下图片,我们可以看出,变量名称的格式,OO_XX[N],N为数组下标。

需求:所有的数组元素值显示在表格控件里。
抱怨:一个个填入好费劲。如果Wincc支持数组变量就无需做多余的工具。
所以,就有了问文心一言的情况
第一问:使用C脚本拼接5个字符串
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = ", World!";
char str3[] = " This is ";
char str4[] = "a test.";
char str5[] = " Enjoy!";
char result[100] = ""; // 初始化一个足够大的数组来保存结果字符串
sprintf(result, "%s%s%s%s%s", str1, str2, str3, str4, str5); // 使用sprintf来拼接字符串
strcpy(result, result); // 使用strcpy来复制结果字符串到另一个变量,因为sprintf的结果是回写到第一个参数的
strcat(result, str5); // 使用strcat来将最后一个字符串添加到结果字符串的末尾
//这句我验证后,是错误的,不需要再拼接最后一个字符串。
printf("%s", result); // 输出结果字符串
return 0;
}
第二问:使用VBS脚本拼接5个字符串
Option Explicit
Dim str1, str2, str3, str4, str5
Dim result
' 定义五个字符串
str1 = "Hello"
str2 = " World"
str3 = "!"
str4 = " I am"
str5 = " a scripting expert."
' 拼接字符串
result = str1 & str2 & str3 & str4 & str5
' 输出结果
WScript.Echo result
第三问:写一个循环C脚本,拼接4个字符串,字符串内容格式为“名称[N]”,其中N是0到39递增加1变化数字。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "String1";
char str2[] = "String2";
char str3[] = "String3";
char str4[] = "String4";
char result[200]; // 足够大的数组来保存结果字符串
int i;
for (i = 0; i <= 39; i++) {
sprintf(result, "%s[%d]", str1, i); // 使用sprintf来拼接字符串
//估计是我描述的不准确,这里string1是名称,i是遍历下标。
//但和我的OO_XX[N]大同小异,我再使用sprintf拼接不就是了。
strcat(result, str2); // 将str2添加到结果字符串的末尾
//和第一问一样,是不对的,多余的。也有可能是我描述错误。
strcat(result, str3); // 将str3添加到结果字符串的末尾
//和第一问一样,是不对的,多余的。也有可能是我描述错误。
strcat(result, str4); // 将str4添加到结果字符串的末尾
//和第一问一样,是不对的,多余的。也有可能是我描述错误。
printf("%s", result); // 输出结果字符串
}
return 0;
}
第四问:写一个循环VBS脚本,拼接4个字符串,字符串内容格式为“名称[N]”,其中N是0到39递增加1变化数字。
Dim str1, str2, str3, str4
Dim result
Dim i
str1 = "String1"
str2 = "String2"
str3 = "String3"
str4 = "String4"
result = ""
For i = 0 To 39
result = result & str1 & "[" & i & "]" & str2 & str3 & str4 & vbCrLf
Next
WScript.Echo result
第五问:用VBS写一个循环脚本,把一维数组大小为40,写入微软表格控件MSHFlexGrid,表格控件固定一行一列,数组按行写入。
Option Explicit
Dim arr(39) '定义一维数组,大小为40
Dim i, j
Dim MSHFlexGrid1 '定义MSHFlexGrid控件
'初始化数组
For i = 0 To 39
arr(i) = "Element " & (i + 1)
Next
'创建MSHFlexGrid控件实例
Set MSHFlexGrid1 = CreateObject("MSHFlexGrid.MSHFlexGrid")
MSHFlexGrid1.SetBounds 0, 0, 200, 200 '设置控件边界
MSHFlexGrid1.Font.Name = "Arial" '设置字体
MSHFlexGrid1.Font.Size = 12 '设置字体大小
MSHFlexGrid1.TextMatrix(1, 1) = "Column 1" '设置第一列标题
MSHFlexGrid1.TextMatrix(1, 2) = "Column 2" '设置第二列标题
'循环遍历数组,按行写入数据到MSHFlexGrid控件
For i = 0 To 39 Step 2 '数组大小为40,每两个元素为一行
MSHFlexGrid1.TextMatrix(i / 2 + 2, 1) = "Row " & (i / 2 + 1) '写入行标题
For j = 0 To i - 1 '遍历当前行的元素
MSHFlexGrid1.TextMatrix((i / 2 + 2) * j + i / 2 + 2, 2) = arr(j) '写入元素到第二列
Next j
Next i
备注:第五问还未验证,不过看着,好像,是可行的样子,小bug可以修改的么。
第六问:用C语言写一个循环脚本,把一维数组大小为40,写入微软表格控件MSHFlexGrid,表格控件固定一行一列,数组按行写入。
对不起,但是用C语言写一个循环脚本将一维数组写入MSHFlexGrid控件可能有点困难,因为MSHFlexGrid控件是Microsoft HTML Help Workshop的一部分,它主要支持HTML和JavaScript,而不是C语言。
如果你想在C语言环境中操作数据并展示在HTML页面上,你可能需要使用一些库来生成HTML页面,或者使用一些Web开发框架如Node.js。
写在最后:
当我们使用wincc的C/VBS脚本无法入门的时候,现在的AI工具值得拥有,前提啊,会问问题!不会问,它给出的答案,和你想象的是两回事。会问问题,也是我们一直在修炼的基本技能,和所有生活工作都有关。