回复:应用探讨——SCL 编程语言使用探讨

氢气

  • 帖子

    47
  • 精华

    8
  • 被关注

    4

论坛等级:游侠

注册时间:2008-04-14

普通 普通 如何晋级?

发布于 2013-09-05 17:09:42

87楼

quote:以下是引用*在2013-08-30 16:31:00的发言:
有没有谁在SCL编写的FC中使用ANY指针做为输入接口?个人感觉在SCL中很不方便,就又用回至STL了。大家有什么体会?

可以作为输入参数的接口,有些系统功能块的接口参数就是ANY类型。做了个相加求和的小程序供参考:

FUNCTION FC10 : Void
VAR_INPUT
Addr1:ANY;
END_VAR
VAR_OUTPUT
Sum:REAL;
END_VAR
VAR_TEMP
TempAny:ANY;
STRForDB AT TempAny: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:INT;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DataNum:INT;
TempSum:REAL;
END_VAR
TempAny:=Addr1;
TempSum:=0.0;
FOR DataNum:= 0 TO STRForDB.DataCount-1 BY 1 DO
TempSum:=TempSum+DWORD_TO_REAL(WORD_TO_BLOCK_DB(STRForDB.DB_Number).DD[DataNum*4]);
END_FOR;
Sum:=TempSum;
END_FUNCTION

在OB1中调用FC10:
ORGANIZATION_BLOCK OB1
VAR_TEMP
info : ARRAY[0..19] OF BYTE;
DBAddr: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:WORD;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DBAddrAny AT DBAddr: ANY;
RealSum:REAL;
END_VAR
DBAddr.SyntaxID:=16#10;
DBAddr.DataType:=16#08;
DBAddr.DataCount:=10;
DBAddr.DB_Number:=16#1;
DBAddr.Byte_Pointer:=dw#16#84000000;
Sum(Addr1 :=DBAddrAny // IN: ANY
,Sum:=RealSum // OUT: REAL
); // VOID
END_ORGANIZATION_BLOCK
这样就完成了从OB1中传递参数给FC10,求和,本例中相当于求“P#DB1.DBX0.0 REAL 10”的和。
例子中是用AT指令和两个STRUCT将ANY指针“分解”,至于有没有STL简洁,就仁者见仁智者见智了。
不过在循环体中,SCL语言明显比STL语言简洁,数据处理也是SCL语言的优势。
---------------------来自西门子工程师
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54652条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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