回复:求教编程技巧(关于一具体实例)

醉书生

  • 帖子

    718
  • 精华

    25
  • 被关注

    18

论坛等级:侠士

注册时间:2004-06-13

普通 普通 如何晋级?

发布于 2004-12-25 03:14:21

0楼

写了函数,你试试看
虽然程序有点长,但实现思想很简单,也比较清楚
就是不知道精如如何


SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=本程序占用
// 定时器 T33
// 输出点 Q0.0 -Q1.4 表示 Q1-Q13
// V内存 VW100 开始的 12 个字, 后12条波形的周期控制字
//
// 基本思想是以 T2+T1 为周期实现一个自复位的定时,根据定时器的当前值的大小来控制 Q1 是否导通
// 小等于 T2 时 Q1 关断,大 T2 时 Q1 导通 (也可以用小等于 T1 时导通,大于 T1 时关断)
//
// 因为用周期值控制,后一条波形的周期值只要比前一个少 T3 时间,则波形自动滞后
// 而第一条波形周期值由定时控制已知,依次递减 T3 可得到后面 12 个周期控制字
// 其规律正好用一个循环控制
//
// 调用方式:CALL SBR0, T1, T2, T3
// T1, T2, T3 须转换为 T33 分辨率格式的单位
VAR_INPUT
time1:WORD; // 导通时间 T1
time2:WORD; // 导通时间 T3
time3:WORD; // 滞后时间 T3
END_VAR
VAR
period:WORD; // 脉冲周期
dHead:DWORD; // 指针,用来访问后面连续的12条波形的周期控制字
wIndex:WORD; // 循环计数器
wOutput:WORD; // 映射输出字
wTmp:WORD; // 字临时变量
bTmp:BYTE; // 字节临时变量
END_VAR
BEGIN
Network 1
// 自复位定时器
LD SM0.0
MOVW LW0, LW6
+I LW2, LW6

AN T33
TON T33, LW6
Network 2 // 输出第一个脉冲
LDW> T33, LW2
= Q0.0

Network 3 // 循环处理后 12 条波形
// 由 T33 的当前值计算后面 12 个周期控制字
// 当前值送临时变量、指针指向第2个控制字、开始循环
LD SM0.0
MOVW T33, LW16
MOVD &VB100, LD8
FOR LW12, 1, 12

Network 4
// 上一个控制字保存在 wTmp 中,减去滞后时间送给当前控制字
// 如果结果为负,则加上一个周期的时间
LD SM0.0
MOVW LW16, *LD8
-I LW4, *LD8
AW< *LD8, 0
+I LW6, *LD8

Network 5 // 确定输出位
// wIndex 代表了当前的输出位号,通过一条解码指令在输出映射变量中将该位置 1
LD SM0.0
ITB LW12, LB18
DECO LB18, LW14

Network 6 // 导通时间
// 输出映射字与 QW0 相与,则 QW0 中对应的位置 1,不影响其它位
LDW> *LD8, LW2
ANDW LW14, QW0

Network 7 // 关断时间
// 输出映射字取反后与 QW0 相或,则 QW0 中对应的位置 0,不影响其它位
LDW<= *LD8, LW2
INVW LW14
ORW LW14, QW0

Network 8
// 当前控制字保存在临时变量中,为下一次循环准备
// 指针后移,指向下一个控制字
LD SM0.0
MOVW *LD8, LW16
+D 2, LD8

Network 9
NEXT
END_SUBROUTINE_BLOCK
生命存在的方式只有两种:腐烂或燃烧
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33257条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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