回复:应用探讨——西门子指针编程使用探讨

Ralf Jones

西门子1847工业学习平台

  • 帖子

    406
  • 精华

    3
  • 被关注

    5

论坛等级:侠客

注册时间:2004-03-11

普通 普通 如何晋级?

发布于 2011-12-05 09:29:00

68楼

quote:以下是引用鹅卵石在2011-12-04 09:13:51的发言:
[quote]以下是引用yiutyi在2011-11-30 12:01:51的发言:
如果要编写通用的程序,并且程序的输入或者输出是指针格式(pointer或者any)就需要使用
P##input(pointer /any),我觉得这个应用很能体现指针的强大,就是对指针所在的地址进行指针寻址:

L P##Input //指向存储地址指针Input首地址,并
LAR1 //装载到地址寄存器AR1中。
L W [AR1,P#4.0] //打开DB块
T #BLOCK_NO
OPN DB [#BLOCK_NO] //如果是DB块,打开指定的DB块。
L W [AR1,P#2.0] //判断ANY指针中数据长度
_001:T #DATA_LEN //通常此处做loop循环!!
L D [AR1,P#6.0] //找出需要计算数据区的开始地址
// do quote]
请问大侠,能否将这个例子说的更加具体性(如做一个简单的FC块,并演示如何调用参数的),方便学习。

乱说两句,抛砖引玉,很多工程师都用过sfc20,如果想编写一个自己的更灵活的sfc20,可以使用指针,例如:

FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
SRCBLK : ANY ;
END_VAR
VAR_OUTPUT
RETVAL : INT ;
DSTBLK : ANY ;
END_VAR
VAR_TEMP
LOOP : INT ;
BLOCK_NO_DB : WORD ;
BLOCK_NO_DI : WORD ;
SRC_ADD : DWORD ;
DST_ADD : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =

L P##SRCBLK; //读取输入any的首地址
LAR1 ; //装载到ar1
L P##DSTBLK; //读取输出any的首地址
LAR2 ; //装载到ar2

L W [AR1,P#4.0]; //打开DB块
T #BLOCK_NO_DB;
L W [AR2,P#4.0]; //打开DI块
T #BLOCK_NO_DI;
OPN DB [#BLOCK_NO_DB]; //打开DB块
OPN DI [#BLOCK_NO_DI]; //打开DI块


L D [AR1,P#6.0];
T #SRC_ADD; //读取地址
L D [AR2,P#6.0];
T #DST_ADD; //读取地址
NETWORK
TITLE =

L W [AR1,P#2.0]; //读取循环次数
_001: T #LOOP;

L DBB [#SRC_ADD];
T DIB [#DST_ADD]; //赋值

//地址偏移1个字节
L P#1.0;
L #SRC_ADD;
+D ;
T #SRC_ADD;

L P#1.0;
L #DST_ADD;
+D ;
T #DST_ADD;
//循环
L #LOOP;
LOOP _001;
END_FUNCTION
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54620条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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