模拟量批量转换 改进版本

已锁定

柳叶飘飘

  • 帖子

    95
  • 精华

    7
  • 被关注

    180

论坛等级:侠圣

注册时间:2016-12-08

钻石 钻石 如何晋级?

模拟量批量转换 改进版本

717

1

2017-12-24 17:15:20

//该版本将模拟量输出值单独放到了另外的DB块数据当中,请注意本程序是FB程序,可直接修改为FC程序节约DB块 该程序只适合300/400PLC 

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

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

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

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

//仪表数量可修改

//版本V1.1

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

FUNCTION_BLOCK FB81


TITLE = '模拟量输入转换'

//

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

//

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

    // 极性设置 BOOL 1为双极性,0为单极性

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

    VALUE:BLOCK_DB;//存放输出结果 

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

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

    // 输出值 REAL

    // 错误状态 bool

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

END_VAR


VAR_IN_OUT

   

END_VAR


VAR_OUTPUT



END_VAR



VAR_TEMP

     I:INT;//循环变量

     TEMP:REAL;


END_VAR

VAR

    K1:REAL;

    K2:REAL;


END_VAR

//循环批量转换循环体

FOR I:= 1 TO NUM  BY 1 DO

//判断是否是双极性

 IF DATA.DX[(I-1)*14+12,0] 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

          VALUE.DX[(I-1)*6+4,0]:=1;

        ELSE

          VALUE.DX[(I-1)*6+4,0]:=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

          VALUE.DX[(I-1)*6+4,0]:=1;

        ELSE

          VALUE.DX[(I-1)*6+4,0]:=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

                     


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

VALUE.DD[(I-1)*6]:=REAL_TO_DWORD(TEMP);


END_FOR;




END_FUNCTION_BLOCK

//原创程序 欢迎交流 QQ 275578306

模拟量批量转换 改进版本 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54082条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

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