技术论坛

 批量WORD转REAL SCL/STL 程序

返回主题列表
作者 主题
steven.lee
侠士

经验值: 1302
发帖数: 175
精华帖: 2
楼主    2021-05-16 10:50:47
主题:批量WORD转REAL SCL/STL 程序

把一个DB块连续地址的WORD类型数据转成REAL类型存于另一个DB块,程序已经仿真验证。

1、STL 程序

FC块程序

VAR_INPUT 

      DB_Source : Word;

      DB_Target : Word;

   END_VAR

   VAR_IN_OUT 

      Loop_Counter : Int;

   END_VAR

   VAR_TEMP 

      TEMP1 : Word;

      TEMP2 : Word;

   END_VAR

BEGIN

NETWORK

TITLE = 

      L #DB_Source;

      T #TEMP1;

      OPN DB[ #TEMP1];

      L #DB_Target;

      T #TEMP2;

      OPN DI[ #TEMP2];

      LAR1 P#0.0;

      LAR2 P#0.0;

      L 6;

COND:      T #Loop_Counter;

      L DBW[ AR1, P#0.0];

      AD 16#FFFF;

      DTR;

      T DID[ AR2, P#0.0];

      +AR1 P#2.0;

      +AR2 P#4.0;

      L #Loop_Counter;

      LOOP COND;

END_FUNCTION

OB1程序

BEGIN

NETWORK

TITLE = 

      CALL "FC_STL_WORD_TO_REAL"

      (  DB_Source                   := 16#3 , 

         DB_Target                   := 16#4 , 

         Loop_Counter                := "Value"

      );

NETWORK

TITLE = 

END_ORGANIZATION_BLOCK

仿真结果如下:




2、SCL程序

FC块程序

   VAR_INPUT 

      DB_Source_NO : Int;

      DB_Source_Address : Int;

      DB_Target_NO : Int;

      DB_Target_Address : Int;

   END_VAR

   VAR_TEMP 

      i : Int;

   END_VAR

BEGIN


FOR #i := 0 TO 5 DO    

    WORD_TO_BLOCK_DB(INT_TO_WORD(#DB_Target_NO)).DD(#DB_Target_Address + #i * 4) :=

    REAL_TO_DWORD(DINT_TO_REAL(DWORD_TO_DINT(WORD_TO_BLOCK_DB(INT_TO_WORD(#DB_Source_NO)).DW(#DB_Source_Address + #i * 2) AND DW#16#FFFF)));

 END_FOR;


END_FUNCTION

OB1程序

BEGIN

"S7-300_SCL_WORD_TO_REAL"(DB_Source_NO:=3,

                          DB_Source_Address:=0,

                          DB_Target_NO:=4,

                          DB_Target_Address:=0);


END_ORGANIZATION_BLOCK






askab
侠圣

经验值: 2790
发帖数: 390
精华帖: 5
3楼    2021-05-17 21:14:52
主题:回复:批量WORD转REAL SCL/STL 程序

DB_Source_NO : Int;  DB_Source_Address : Int;  DB_Target_NO : Int;   DB_Target_Address : Int;

在你定义了DB块号 和DB起始地址,则说明你首先已经定义且生成好了DB块,

那是否可以简单一些。

DB_Source_data :array[1..NO] OF  Int;  //定义WORD 型数据 为 NO 为个数 

DB_Target_data :array[1..NO] OF  REAL;  //定义REAL 型数据 为 NO 为个数 

FOR i:= 1 TO NO BY 1 DO

DB_Target_data[i]:=  INT_TO_REAL(WORD_TO_INT(DB_Source_data[i]));

END_FOR; 

可以用UDT 自定义DB_Source_data和DB_Target。

然后调用SFC20 即可。

你觉得是否书写和理解更清晰一下。

一般最好不要用

WORD_TO_BLOCK_DB(INT_TO_WORD(#DB_Target_NO)).DD(#DB_Target_Address + #i * 4);

这种格式,容易出错,不是编译过去就是一定是正确运行的。

个人建议。

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