声明部分的结构
块内的声明部分包含以下子域:
常量:介于CONST 和END_CONST 之间。
输入参数:在VAR_INPUT和END_VAR之间。
输出参数:介于VAR_OUTPUT 和END_VAR 之间。
静态变量:介于VAR 和END_VAR 之间。还包括EVALUATE 块的本地实例的声明。
常量
限制:=7;
数量:=限制+ 1;
END_CONST
VAR_INPUT 输入变量声明
measval_in :INT; //新的测量值
纽瓦尔:BOOL; //环形缓冲区'measvals'中的测量值
度假村:BOOL; //对测量值进行排序
funct_sel :BOOL; //选择计算平方根/平方
新闻:BOOL; //获取输出地址
选择:WORD; //输出地址
END_VAR
VAR_OUTPUT 输出变量声明
结果输出:INT; //计算值
measval_out:INT; //对应的测量值
END_VAR
VAR 静态变量声明
measvals:ARRAY[0.LIMIT] OF INT :=8(0);
resultbuffer:ARRAY[0.LIMIT] OF
结构体
平方根:INT;
square:INT;
END_STRUCT;
指针:INT:=0;
oldval:BOOL:=真;
oldsort:BOOL:=TRUE;
oldsel:BOOL:=TRUE;地址:INT:=0; //转换后的输出地址
outvalues_instance: 评估; //定义本地实例
END_VAR
静态变量
由于某些数据将保留到下一个程序周期,因此选择FB 块类型。一些静态变量在声明部分“VAR,END_VAR”中声明。
静态变量是局部变量,其值在每个块处理过程中都保留。它们用于保留功能块值并存储在实例数据块中。
初始化变量
请记住在块初始化时(下载到CPU 之后)在变量中键入初始值。功能块EVALUATE 的本地实例也在声明子字段“VAR, END_VAR”中声明。它的名称用于后续调用和访问输出参数。共享实例ACQUIRE_DATA用于存储数据。
语句部分的结构
ACQUIRE的语句部分分为三个子部分:
获取测量值:
如果输入参数“newval”和“oldval”不同,则将新的测量值读入环形缓冲区。
开始排序和计算:
比较输入参数'resort'和'oldsort',当发生变化时,通过调用EVALUATE功能块开始排序和计算。
获取代码并准备输出:
计算地址
下图显示了如何计算地址: 检测到代码采集开关(位15)的边沿,输入字IW0 的位12 至14 包含读取的代码。使用标准函数SHR右移并用AND屏蔽相应位即可得到“地址”。
该地址用于将数组元素(计算结果和相应的测量值)写入输出参数。是基于均方还是平方值取决于“funct_sel”。
因为“newsel”和“oldsel”不同,所以检测到代码获取开关的边缘。
逻辑块的语句部分如下:
开始
(******************************************************** **********************
第1 部分:获取测量值。
如果“newval”值发生变化,则表明已输入测量值。 MOD 运算用于实现测量值的环形缓冲区。
****************************************************** *****************)
IF 新值旧值THEN
指针:=指针MOD数量;
measvals[指针] :=measval_in;
指针:=指针+1;
万一;
旧值:=新值;
(******************************************************** **********************
第2 部分:开始排序和计算
如果“度假村”发生变化,则开始对环形缓冲区进行排序并对测量值进行计算。
结果存储在一个名为“calcbuffer”的新数组中。
****************************************************** *****************)
IF 度假村oldsort 那么
指针:=0; //重置缓冲区指针
eval_instance(sortbuffer :=measvals); //调用评估
万一;
oldsort :=度假村;
resultbuffer :=eval_instance.calcbuffer; //平方值和均方根
(******************************************************** **********************
第3 部分:查找代码值并准备输出
如果'newsel'改变,计算用于输出的数组元素的寻址代码:mask 'selection'
相应的位并转换为整数。根据“funct_sel”开关的设置,选择“squareroot”或
'square' 用于输出。
****************************************************** *****************)
IF 新闻塞尔奥塞尔THEN
地址:=WORD_TO_INT(SHR(IN :=选择,N :=12) AND 16#0007);
万一;
oldsel :=新闻塞尔;
IF funt_sel 那么
result_out :=resultbuffer[地址].square;
别的
result_out :=resultbuffer[地址].squareroot;
万一;
measval_out :=measvals[地址]; //测量值显示
END_FUNCTION_BLOCK
审稿人:刘庆