优秀的编程知识分享平台

网站首页 > 技术文章 正文

西门子SCL语言中如何求——任意长度数组的最大值和平均值

nanyue 2024-10-25 13:24:33 技术文章 5 ℃

西门子SCL语言中如何求——任意长度数组的最大值和平均值(基于泛型数据类型)

本块适用于整型和浮点型或者其它类型

FC块的数据类型定义:

DB块中的原始数据:



效果展示图:

浮点数组 整型数组

如果输入的数组长度超过了FC块中定义的长度,那么,会产生错误信息 我们把数组长写成300长度

Message 错误消息展示

原码如下:

备注:本程序的数组输入索引是必须从0开始,本代码已通过测试,拷贝即可使用

IF IS_ARRAY(#in_array) THEN //判断是否是数组

#arr_length := UDINT_TO_DINT(CountOfElements(#in_array)); //找到数组的长度,函数返回值类型是UDINT,要转成DINT

IF #arr_length < #max_length THEN //如果输入的数组的长度小于设定的最大长度 则进行以下判断

//**************************判断数组是整数进行计算***************************************

IF TypeOfElements(#in_array) = Int THEN //判断输入数组的类型

VariantGet(SRC := #in_array,

DST => #arr_int_temp);

#max_number_temp_int := #arr_int_temp[0]; //把索引为0的数认为是最大值

#max_index_temp := 0; //把0索引存起来

FOR #i := 0 TO #max_length - 1 DO //循环 从最小索引开始,到最大索引结束

IF #max_number_temp_int < #arr_int_temp[#i] THEN //如果最大值小于后面索引的值

#max_number_temp_int := #arr_int_temp[#i]; //则把后面索引的值存入最大值变量里

#max_index_temp := #i; //再把索引存起来

END_IF;

#sum := #sum + #arr_int_temp[#i];

END_FOR;

VariantPut(SRC := #max_number_temp_int,

DST := #max_out); //把最大值输出 int

#max_index := #max_index_temp; //把最大值的索引输出

#avg := #sum / #arr_length;

//*******************************如果数组是浮点进行计算*********************************

ELSIF TypeOfElements(#in_array) = Real THEN //判断输入数组的类型

VariantGet(SRC := #in_array,

DST => #arr_real_temp); //把输入的数组传入到内部数组进行处理

#max_number_temp_real := #arr_real_temp[0]; //把索引为0的数认为是最大值

#max_index_temp := 0; //把0索引存起来

FOR #i := 0 TO #max_length - 1 DO //循环 从最小索引开始,到最大索引结束

IF #max_number_temp_real < #arr_real_temp[#i] THEN //如果最大值小于后面索引的值

#max_number_temp_real := #arr_real_temp[#i]; //则把后面索引的值存入最大值变量里

#max_index_temp := #i; //再把索引存起来

END_IF;

#sum := #sum + #arr_real_temp[#i];

END_FOR;

VariantPut(SRC := #max_number_temp_real,

DST := #max_out); //把最大值输出 real

#max_index := #max_index_temp; //把最大值的索引输出

#avg := #sum / #arr_length;

END_IF;

ELSE

#message := 'fault'; //如果输入的数组长度超过200个,那就报错

END_IF;

END_IF;

Tags:

最近发表
标签列表