哈喽,你好啊,我是雷工!
今天在交流群中有个兄弟问到一个问题:
上位机中通过一个设置界面,向很多个设备统一传送参数,有什么好的实现方式?
有的群友说直接传送啊,通过IF判断,然后赋值啊。
但是需要通过勾选,确定哪些下发,哪些不下发,几台的还可以通过复制粘贴修改来实现,
但是要是有上百台设备呢?有上千台设备呢?
几十个参数下发到上百台设备都复制粘贴修改,来实现,那不得累死了。
下面介绍一个通过数组和循环来实现的一个办法,代码会大大减少。
01 实现功能
通过一个KingSCADA小案例实现将两个设置温度,通过添加两个复选框,根据复选框是否勾选,点下发按钮,下发到两个设备。
02 效果演示
以下试运行态的演示效果。
03 实现思路
实现思路是为了便于扩展,当要下发的设备从2台扩展到200台时,只需要修改少量的代码,甚至修改一个参数就能实现扩展,而不是要复制、粘贴、修改200遍,那种方式就太低级了。
在C#面向对象的编程思想中,重复的代码要提炼缩减代码,避免有重复的代码。
用最少的代码实现最复杂的功能,才能体现出代码的优雅。
实现思路就是通过循环,数组,
要将每台设备要设置的参数统一名称,通过前缀A_或B_……
这个选择也可以放到一个数组里,然后通过循环遍历数组实现。
04 实现步骤
4.1、添加变量
根据需要添加必要的变量,如下图:
4.2、创建界面
添加测试界面,添加必要的标签,复选框,下发按钮等控件。
4.3、连接变量
将界面上的控件和变量连接;
4.4、复选框
双击复选框,在点击复选框时将状态值修改到对应变量,这里使用变量是变量可以设置保存参数选项,将勾选的状态保存,当下次再启动时还能有上次的勾选状态。
\\local\check_1=UICheckBox1.Checked;
4.5、创建数组
创建一个字符串数组,用来存储代表不同设备的前缀,如下:
string[2] idArray={"A_","B_"};
这里用2个元素的数组举例,后面要扩展的话只需要修改数组的元素数量,以及对应的元素字符即可。
4.6、GetTagField
GetTagField函数在KingSCADA中的功能是通过变量域名称获取变量域值,
注意事项:
该函数适用于非周期性获取少量变量域值,不适合长期周期性的获取数值。
函数格式:
GetTagField(string TagName, string FieldName);
参数说明:
TagName表示变量的名称;
FieldName表示变量域的名称;
这里变量域开始查了半天才理解什么意思,获取值的话,变量域是“Value”。
返回值的类型为字符串,该函数会将变量域的值转换成字符串返回。
示例:
string k=GetTagField("check_"+i,"Value");
示例的意思为获取check1变量的值,在示例中用循环数值i拼成变量名称,这样做,当遇到扩展要下发的设备时,该语句都不需要修改,非常方便;
4.7、StrFromInt
在KingSCADA中StrFromInt函数的功能是将一整数值转换为另一进制下的字符串表示。
函数格式:
StrFromInt(int nInteger, int nbase);
参数说明:
nInteger表示要转换的参数;
nbase表示要转换的进制,取值范围是2-63,示例中是将其转换成10进制的表示形式。
该函数的返回值是字符串类型;
示例:
string strset2=StrFromInt(set2,10);
该示例中是将设定值转换为后面需要的字符串形式;
4.8、SetTagField
在KingSCADA中SetTagField函数是为了实现设置变量域的值;
函数格式:
SetTagField(string TagName, string FieldName, string Value);
参数说明:
TagName表示要修改的变量的名称;
FieldName表示要修改的变量域的名称;
Value表示要修改的变量域的值;
该函数的返回值是布尔型,通过返回True或False来表示设置成功,还是设置失败;
示例:
SetTagField(a2,"Value",strset2);
示例中是将设定值给定到设备参数,设备参数名称也是通过循环变量i选择数组中的字符串拼接成要设置的参数名称;
4.9、下发按钮
下发按钮主要是触发整个脚本代码,脚本中使用的所有函数均在上面介绍过,下面直接贴出按钮的完整代码:
//创建一个数组idArray,用于放置区号
string[2] idArray={"A_","B_"};
for(int i=1;i<3;i++)
{
string k=GetTagField("check_"+i,"Value");
if(k=="1")
{
string qy=idArray[i-1];
string a1=qy+"设置温度1";
string a2=qy+"设置温度2";
int set1=\\local\设置温度1;
int set2=\\local\设置温度2;
string strset1=StrFromInt(set1,10);
string strset2=StrFromInt(set2,10);
SetTagField(a1,"Value",strset1);
SetTagField(a2,"Value",strset2);
}
}
代码还是比较简洁的,当遇到要扩充增加下传的设备时,只需要简单的修改数组和循环次数即可,非常便于扩展。
05 后记
以上是根据群友的需求做的一个测试样例,很好的实现了下发很多台设备但不用重复复制粘贴赋值的一种实现方式。
大大减少了脚本代码的行数,而且兼顾了可读性和易扩展性。
大家有更好的实现方式欢迎评论交流,集思广益。
遇到问题预期闭门造车,不如在群中头脑风暴,或许能碰撞出更好的点子。
现在可免费加入的交流群有以下5个,有兴趣的小伙伴欢迎加入,畅所欲言。
①、雷工笔记★综合交流群
②、雷工笔记★工控技术交流群
③、雷工笔记★C# 技术交流群
④、雷工笔记★副业交流群
⑤、雷工★资源分享群
觉得有收获欢迎点赞,评论,转发呦,非常感谢~