QQ登录

只需一步,快速开始

在DB块循环采数的问题

[ 复制链接 ]
在DB块循环采数的问题

各位大侠,我想写一个在DB块循环采数的程序,要求是在一个db块里有100个双整数的数值,一个脉冲触发,将第一个数值传到md100里,再来一个脉冲触发,将第二个数值写到md100里,如此类推,传到第100个以后,又回到第一个数值,一直循环。

现在写了一半,不知道如何写下去


L L#0 初始化计数器

T MD10

opn db100 打开数据块

L P#0.0 数据块的初始地址

lar1

l dbd[ar1,p#0.0]

t md100 写入目标中间变量


-------这个程序我做过,一开始是用循环来做的但是老失败,问题就是在初始化的问题上,所以我直接用中间变量MD310,只要没有用到那么肯定是为0的,以下是程序:

      OPN   DB    100

      A     M    309.0 触发的按钮

      FP    M    309.1

      JCN   B005

      L     DBW [MD 310]  //MD310是存放指针用的,要保证取一个没有用过的

      T     MD   100      //取出的数放在的位置

      L     MD   310

      L     3168           //(100-1)*32

      <D                  //将指针的值进行比较是否超过了100个双整数,

      JCN   B006

      L     MD   310

      INC   32

      T     MD   310      //地址自加

      JU    B007

B006: L     0

      T     MD   310

B005: NOP   0

B007: NOP   0


--------用库啊,库里有双截棍!记得库里有add tab(大概是fc84?)和FIFO(fc95?不是太记得),填表和先进先出指令库,这是把数据当作数组。还有就是可以用sfc20blockmove把数据当作一个块。

自己编的话就用指针,个人觉得存储器指针更灵活一些,指针可加可减,而寄存器指针只能加。脉冲到来,指针偏移两个字


-------有段时间我也特别沉迷于指针编程,结果时间和精力都花在底层上了,对于程序的架构反而构思不清,好比明明有7815不用,非要自己用单个元件做出一个稳压电源才有成功感,结果是捡了芝麻丢了西瓜。

好的编程员应该将主要精力集中到自己要做的事情上来,仔细斟酌方案,不拘泥于具体实现的细节。

写下这段话没有其他意思,完全是自勉


-----FUNCTION_BLOCK FB1


VAR_Input
    DB_ID :INT;
END_VAR
VAR
   Addr   :INT;
END_VAR

      IF Addr>400 THEN
         Addr:=0;
      END_IF;
      
      MD100:= WORD_TO_BLOCK_DB( INT_TO_WORD(DB_ID) ).DD[ Addr ];
      
      Addr:=Addr+4;
   
   
END_FUNCTION_BLOCK

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索