题目:
按钮按下去,第一个灯亮2秒,灭3秒,第二个灯亮3秒,灭4秒,以此类推;
输入参数:
亮时间:
灭时间:
灯数量:
关键知识点:
1、西门子smart200里面的指针是也是存储地址的,存储指针的变量的字节大小是4个字节,所以在取地址给指针变量的时候,应该用MOV_DW的指令去赋值。
2、指针可以指向的区域类似只包括以下几个:I、Q、V、M、S、 T(仅限当前值,我的理解是有使用的)、C(仅限当前值)、SM、AI 和 AQ。
3、可以当作指针(存储地址的变量类型是V、L、AC(累加寄存器AC0、AC1、AC2))
4、&:取地址符号。
* :获取地址所指向的区域的数值大小,对于的存储字节大小是根据一开始指针指向的变量的数据类型的大小来的。
程序:
标准块1
参数:
light_time:灯亮的时间
btn_click:暂时没用到
ledNum:设置灯的数量
dark_timeL:灯灭的时间
程序1
解释: 初始化参数VW1(记录当前到第几个灯),AC1(存储当前指向的目标的地址,图中是MB0,&是提取地址的作用),VW3(存储灯亮时间变量)、VW5(存储灯灭时间变量)、VW7、V333.0(让后面的东西只执行一次,其实可以用步骤法来做的)
程序2
解释:
第一,指针移位偏移量数据处理,因为我是用SHLB字节左移移位指去控制等的切换的,所以我这边我除以8来获得每个字节下一个位所需要的左移偏移量,第一个不需要移位所以就是0,以此类推到第八个灯,也就是字节的第八位。
第二,VB106是用亮灭执行完毕循环次数/8得到的余数,当它等于0的是时候,这时候代表一字节的循环周期已经完成,需要进行指针加一,指向下一个字节。在这个加一指令的前后分别是把当前指针指向的字节清0,和让下一个字节的第一位置一。
程序3
解释:移位指令部分,V100.0(在V100.0得电前,把当前指针指向的字节置一,然后把V100.0线圈得电,移位,相当于亮灯),V100.0(在V100.1得电前,把当前指针指向的字节置0,然后把V100.1线圈得电,移位,相当于灭灯)。
*AC1指向AC1变量存储的地址所指向的存储区域的变量
程序4
解释:定时器T35时间小于VW3的时候,让V100.0线圈得电,同时初始化一次,让当前指向的变量第一位置为1.
定时器T35时间大于VW3小于VW7(亮灯+灭灯的时间)的时候,让V100.1线圈得电,同时初始化一次,让当前指向的变量第一位置为0.
定时器T35时间大于VW7(亮灯+灭灯的时间)且小于要运行的灯的数量的时候,
记录当前第几个灯的变量加一,同时V2000.0线圈得电,定时器复位,进入下一个灯的循环计时。
同时,让亮灭循环次数加一,然后让亮灭循环次数变量/8,获取余数VB106.