作者 | 主题 |
---|---|
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 !
|