技术论坛

 回复:大批量仪表量程转换(修正版)

返回主题列表
作者 主题
柳叶飘飘
侠圣

经验值:2634
发帖数:95
精华帖:7
楼主    2016-12-28 23:24:47
主题:大批量仪表量程转换(修正版)

本程序想给偷懒不想用FC105一个个转换仪表量程使用(假如有几十上百个一个个转换比较费时间),即批量话转换。刚写好就发出来了 各位测试哈吧 不明白请回帖

第一次发的程序有点问题 以下是修改后的程序给大家测试。

源代码如下

//##############################################

//实现批量化的量程转换

//比较适合采样点特别多的情况

//仅适合需要量程转换的通道比如电流4~20MA电压+-10V

//默认最大1000个仪表以内可以修改

//############################################

FUNCTION_BLOCK FB80


TITLE = 'AI_OUT'

//

// 模拟量输入量程批量转换

//

VERSION: '1.0'

AUTHOR: EBCLW

NAME: AI_OUT

FAMILY: EBC


KNOW_HOW_PROTECT



// Block Parameters

VAR_INPUT

    ADDRESS:INT:=512;//开始的PIW地址

    NUM:INT:=1;//仪表数量即多少个PIW地址

    DATA:BLOCK_DB;  //用于存放数据的量程 偏差设定  

    //DB数据结构为(每个仪表均是这样的结构建议用STL生成)

    //------------------

    // 量程上限 REAL

    // 量程下限 REAL

    // 修正偏差 REAL

    //-------------------

    

    BIPOLAR:ARRAY[1..1000] OF BOOL;//1为双极性,0为单极性

END_VAR


VAR_IN_OUT

    // I/O Parameters

END_VAR


VAR_OUTPUT

    //默认一千个

   OUT:ARRAY[1..1000] OF REAL;

   ERR:ARRAY[1..1000]OF BOOL;

    // Output Parameters


END_VAR



VAR_TEMP

     I:INT;//循环变量


END_VAR

VAR

    K1:REAL;

    K2:REAL;


END_VAR

//循环批量转换循环体

FOR I:= 1 TO NUM  BY 1 DO

//判断是否是双极性

 IF BIPOLAR[I] THEN

    K1:= -27648.0;

    K2:= 27648.0;

       IF  (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) <-27649) OR (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) >27649) THEN  //双极性低于正常或者高于正常则通道标志位置1

          ERR[I]:=1;

        ELSE

          ERR[I]:=0;

       END_IF;       

   ELSE

    K1:=0.0;

    K2:=27648.0;

    //判断是否在量程范围内不在测量范围内即对该仪表报警

      IF  (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) <-1) OR (WORD_TO_INT(PIW[ADDRESS +(I-1)*2]) >27649) THEN  //单极性低于正常或者高于正常则通道标志位置1

          ERR[I]:=1;

        ELSE

          ERR[I]:=0;

      END_IF;

 END_IF;


 //若在量程范围内就做量程转换

 //采用FC105相同的计算公式OUT = ((FLOAT (IN) -K1)/(K2-K1)) * (HI_LIM-LO_LIM) + LO_LIM

 //增加一个修正偏差公式改为OUT = ((FLOAT (IN) -K1)/(K2-K1)) * (HI_LIM-LO_LIM) + LO_LIM + OFFSET

                     


OUT[I]:=(INT_TO_REAL(WORD_TO_INT(PIW[ADDRESS +(I-1)*2]))-K1)/(K2-K1)*(DWORD_TO_REAL(DATA.DD[(I-1)*12])-DWORD_TO_REAL(DATA.DD[(I-1)*12+4]))+DWORD_TO_REAL(DATA.DD[(I-1)*12+4])+DWORD_TO_REAL(DATA.DD[(I-1)*12+8]);



END_FOR;




END_FUNCTION_BLOCK

//原创程序 欢迎交流 QQ275578306?

//本程序编译通过测试,有BUG的话请告知

//修改了双极性的问题20161229

努力赚钱 养家糊口
宁超
至圣

经验值:11563
发帖数:1009
精华帖:39
27楼    2017-03-18 16:14:07
精华帖  主题:回复:大批量仪表量程转换(修正版)

以前也用过类似的方法,实际项目,可适应性范围很小:

  1. 模拟量需要全部连续

  2. 都是线性模拟量处理,不能有开根号或者RTD这样的处理


针对楼主的程序显而易见的缺点除了上面外,另:

  1. Out输出1000个real就是浪费,根本就不需要输出显示,悄悄放DB里就好了。

  2. 通道错误处理太粗糙,小于4mA和大于20mA是平常的事情,应该有个范围,3.6毫安或者20.3mA等都要算正常。

  3. FC105的功能太少。仿真?替代值功能?

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。