回复:【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作

已锁定

芳季

西门子1847工业学习平台

  • 帖子

    15511
  • 精华

    101
  • 被关注

    961

论坛等级:至圣

注册时间:2007-08-03

钻石 钻石 如何晋级?

发布于 2021-11-21 08:20:44

68楼

两个引导的子程序。各用户子程序必须在前面加上固定的程序获取地址。这个套路只适合全扫描。

ORGANIZATION_BLOCK MAIN:OB1

TITLE=程序注释

BEGIN

Network 1 

// 定式

// 制作子程序横向传递的参数。

// 目前打算从vb1000开始向后安排子程序的所有所需空间。

LD     SM0.0

CALL   SBR0, &VB1000

Network 2 

LD     SM0.0

CALL   SBR3

CALL   SBR4

Network 3 

// 定式

// 计算地址是否超限

// 目前未制作。

END_ORGANIZATION_BLOCK

SUBROUTINE_BLOCK SBR_0:SBR0

TITLE=本程序作用是向8个级子程序的LD56写入可以安排的首地址。

// 任何一个非中断调用的子程序的LD56都含有有关要素。

VAR_INPUT

起始地址针:DWORD;

END_VAR

BEGIN

Network 1 

// 象征性备用。目前没用。需要使用的时候向前扩展所需。

// 向第一级子程序LD56写入要素。(总)可分配地址工作区首地址指针。任何子程序的LD56都指向同一个V地址。

// 向指针指向的对象写入可分配地址。这个地址就是vb1000。

// 调用一个子程序向2345678级子程序的LD56写入上述信息。

LD     SM0.0

MOVB   0, LB55

MOVD   LD0, LD56

MOVD   LD0, *LD56

CALL   SBR1, LD0, LB55

Network 2 

// 承若使用本程序后必须保留8级子程序的LD56不被使用。

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK SBR_1:SBR1

TITLE=子程序注释

VAR_INPUT

起始地址:DWORD;

END_VAR

VAR_IN_OUT

第N次递归:BYTE;

END_VAR

BEGIN

Network 1 

// 观察递归次数

// 写入要素。

LD     SM0.0

MOVB   LB4, LB55

INCB   LB55

MOVD   LD0, LD56

Network 2 

// 递归到达最大值,便不再进行。

LDB=   LB55, 7

CRET

Network 3 

// 递归自己是为了不用写7个相同的工作的子程序。没有别的意思。

LD     SM0.0

CALL   SBR1, LD56, LB55

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK 常规子程序1:SBR3

TITLE=子程序注释

VAR

空闲处:DWORD;

自己首址:DWORD;

END_VAR

BEGIN

Network 1 

// 定式

// 获得当前空闲的地址

// 定式

// 假设本子程序需要4字节的空间。

LD     SM0.0

MOVD   LD56, LD0

MOVD   *LD0, LD4

+D     +4, LD4

+D     4, *LD0

Network 2 

// 用户程序

// 在自己的地址里面运算。

LD     SM0.0

+D     1, *LD4

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK 常规子程序2:SBR4

TITLE=子程序注释

VAR

空闲处:DWORD;

自己首址:DWORD;

自己二址:DWORD;

END_VAR

BEGIN

Network 1 

// 定式

// 获得当前空闲的地址

// 定式

// 假设本子程序需要8字节的空间。

LD     SM0.0

MOVD   LD56, LD0

MOVD   *LD0, LD4

+D     +4, LD4

+D     8, *LD0

Network 2 

// 自己的往后区域的间接寻址

LD     SM0.0

MOVD   LD4, LD8

+D     +4, LD8

Network 3 

// 假设的程序对数据进行操作

LD     SM0.0

+D     1, *LD4

Network 4 

LD     SM0.0

+D     2, *LD8

Network 5 

// 程序有它自己的下级子程序

LD     SM0.0

CALL   SBR5

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK SBR_5:SBR5

TITLE=子程序注释

VAR

空闲处:DWORD;

自己首址:DWORD;

自己二址:DWORD;

END_VAR

BEGIN

Network 1 

// 定式

// 获得当前空闲的地址

// 定式

// 假设本子程序需要8字节的空间。

LD     SM0.0

MOVD   LD56, LD0

MOVD   *LD0, LD4

+D     +4, LD4

+D     8, *LD0

Network 2 

// 自己的往后区域的间接寻址

LD     SM0.0

MOVD   +4, LD8

+D     LD4, LD8

Network 3 

// 假设的程序对数据进行操作

LD     SM0.0

+D     3, *LD4

Network 4 

// 假设的程序对数据进行操作

LD     SM0.0

+D     4, *LD8

END_SUBROUTINE_BLOCK

INTERRUPT_BLOCK INT_0:INT0

TITLE=中断例程注释

BEGIN

Network 1 

// 程序段注释

END_INTERRUPT_BLOCK

我希望用手机的朋友都可以看到程序,例如yanxiao,所以用语句表示。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有8945条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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