哈喽,你好啊,我是雷工!
在前面《KingSCADA中如何实现到期提醒?》中记录演示了实现到期提醒功能。
实际项目中不可能只有一台设备需要用到到期维保提醒,或到期更换配件提醒。
很可能一个项目中就要有几十上百个设备,那样的话脚本会比较多,而且遇到修改的时候也会比较繁琐。
考虑是否可以使用自定义函数,一来可以缩减脚本规模,二来修改可以较简洁,三是代码看上去也会比较整齐。
因此尝试使用自定义函数优化实现到期提醒功能,以下为测试练习笔记。
01 自定义函数
这里自定义函数的使用相当于将公用程序放到了一个自定义函数中。
KingSCADA中自定义函数是利用类似C语言来编写的一段程序,其本身不能直接被触发,需要通过其他脚本程序来调用执行。
02 自定义函数返回值
自定义函数可以有六种返回值,这个实例中函数返回值为bool,布尔型。
03 自定义函数构成
①自定义函数类型(函数返回值类型)
②函数名和参数类型及名称
③函数体内容
04 定义自定义函数
4.1、返回类型
首先在【脚本】中的【自定义脚本】下选中【自定义函数】,点击【新建】按钮,选择自定义函数类型为bool;
4.2、函数名称
在返回值类型框后面的编辑框中输入该函数的名称,不能为空。
函数名+参数,总长度不能超过128个字符。
此处命名为:ExpirationAlarm(string nDate,int nMonth)
4.3、函数体程序
在下面的脚本编辑区输入函数体程序。
在程序中可以使用自定义变量。函数体中的最后部分是返回语句。
如果该函数有返回值,则使用return value(value为某个变量的名称)。
对于无返回值的函数也可以使用Return,但只能单独使用Return,表示当前命令语言或函数执行结束。
本案例函数主体程序为:
//函数说明:用于判断是否超期
//参数:bool Resule--判断结果
//string nDate:上次记录日期格式:“2025-1-20”;
//int nMonth:设置月数,
//获取当前系统的日期
string Date2=GetSystemtimeDateString();
//比较上次维保日期与当前系统日期
int nCurrentM;
bool Result;
nCurrentM=DateDiff("M",nDate,Date2);
//如果日期相差大于12个月则报警
if(nCurrentM>nMonth)
{
Result=true;
}else
{
Result=false;
}
return Result;
运行起来效果是一样的。
05 调用自定义函数
原事件脚本:
string Date2=GetSystemtimeDateString();
\\local\间隔月份=DateDiff ("M",\\local\上次维保日期,Date2);
if(\\local\间隔月份>12)
{
\\local\已到期=1;
}else
{
\\local\已到期=0;
}
替换为自定义函数的写法:
\\local\已到期=/*bool*/ ExpirationAlarm(\\local\上次维保日期,12);
06 后记
缩减后的脚本仅为1行,当遇到几十上百台时,代码量大大缩减,而且简洁,整齐,不易出错。
同样是写代码,有的人写的代码简洁却不简单,简短却强大,移植性,复用性都比较强;
但有的人写的代码,巨长臃肿,大量重复代码,移植时不易修改,修改量大,复用价值不高;
所有人和人的差距很大,代码和代码的差距也很大,
愿我们写代码的时候都能够在能用就行的基础上,让代码更优雅。
避免出现人见人骂的屎山级代码。