- 累加器
- 200smart 有
AC0 AC1 AC2 AC3
四个累加器,不能作为位访问 - 累加器大小均是
32位
- 累加器的数值不会自动清零,中断会保持并重新装载累加器(进入中断时先把原来的值保存起来,退出中断程序后恢复原程序)
- 只有
AC1/AC2/AC3可以用作指针
AC0不用作指针,不用作间接寻址
- 200smart 有
LD SM0.0 //Always_On
MOVD &VB0, AC1 //把从VB的起始的地址存入到AC1中,传地址用的DWORD
MOVW *AC1, VW2 //*,把AC1地址所指向的内容给到VW2,值本身用的WORD
- 指针
- 指针的目的,实现数据寻址
//一个案例,实现VW0,VW2,VW4,VW6累加
//Network 1
LD SM0.0
MOVD &VB0, AC1 //把起始地址给累加器1
//Network 2
LD M0.0 //启动信号,启动循环
EU //上升沿
FOR VW100, 1, 4 //for循环,VW100只是用来装当前循环次数的容器,不需要赋值。对应成SCL表示为`for VW100:=1 to 4 by 1 do`
//Network 3
LD SM0.0
MOVD AC1, LD0 //自己新建了一个地址是LD0的DWORDL区变量,用来存地址
+D 2, LD0 //把LD的地址+2,结果存在LD中,表示AC1的下一个地址
+I *AC1, *LD0 //把两个地址对应的数据相加,结果存在*LD0里面
+D 2, AC1 //把AC1的地址+2,开始下一次循环
//Network 4
NEXT //FOR..NEXT
注意:
`+D`/`+I`/`MOVD`等指令,它的计算结果放在第二个数里面,比如`<+D 2, LD0>`,运算结果存回LDO中。
- 冒泡排序里面应用
累加器
和&
- 原理:比较相邻的两个元素,如果第一个比第二个大,则交换位置;一轮结束后,最后一个元素将会是最大的数,针对所有元素重复上述循环
//子程序开始,表示一些块信息,标识符:<SUBROUTINE_BLOCK>
SUBROUTINE_BLOCK 冒泡排序:SBR0
TITLE=子程序注释
//符号表内容,标识符:<VAR_INPUT..END_VAR>
VAR_INPUT
start:BOOL;
Data_Ptr:DWORD; // 双字地址指针
Count:INT; // 长度
END_VAR
//变量表内容,标识符:<VAR..END_VAR>
VAR
Index:INT; // For循环使用变量
Middle:INT; // 中间变量
END_VAR
//程序段正式开始,标识符:<BEGIN..END_SUBROUTINE_BLOCK>
BEGIN
Network 1
// 创建指针地址
LD SM0.0
MOVD LD1, AC1 //这里的LD1指的是Data_Ptr,要排序的数的首地址
Network 2
LD L0.0 //表示start,开始排序触发
FOR LW7, 2, LW5 //for循环,LW7表示index,LW5表示Count
Network 3
LD SM0.0
LPS //逻辑进栈,STL自动生成。表示并联梯形图扫描的先后
MOVD AC1, AC2
+D +2, AC2 //AC2=AC1+2
AW> *AC1, *AC2 //比较指令,*AC1是否大于*AC2
MOVW *AC1, LW9 //LW9,定义的一个中间变量
MOVW *AC2, *AC1
MOVW LW9, *AC2
LPP //逻辑出栈,STL自动生成。开始读另一个分支
+D 2, AC1
Network 4
NEXT
END_SUBROUTINE_BLOCK
标签:200,LD,Network,累加器,地址,AC2,AC1,寄存器,Smart
From: https://www.cnblogs.com/xiacuncun/p/18145817