-
-
-
ytzidonghua | 当前状态:在线
总积分:11263 2025年可用积分:0
注册时间: 2006-09-18
最后登录时间: 2024-08-02
-
-
300教程之四
ytzidonghua 发表于 2007/7/5 12:58:05 1514 查看 1 回复 [上一主题] [下一主题]
手机阅读
在CPU内部,时间值以二进制格式存放,占定时器字的0~9位。
可以按下列的形式将时间预置值装入累加器的低位字:
(1) 十六进制数W#16#wxyz,其中的w是时间基准,xyz是BCD码形式的时间值。
(2) S5T#aH_bM_cS_Dms,例如S5T#18S。
时基代码为二进制数00,01,10和11时,对应的时基分别为10ms,100ms,1s和10s。
6.脉冲定时器
类似于上升沿触发的单稳态电路。
S5脉冲定时器(Pulse S5 Timer),S为设置输入端,TV为预置值输入端,R为复位输入端;Q为定时器位输出端,BI输出不带时基的十六进制格式,BCD输出BCD格式的当前时间值和时基。
定时器中的S,R,Q为BOOL(位)变量,BI和BCD为WORD(字)变量,TV为S5TIME量。各变量均可以使用I, Q, M, L, D存储区, TV也可以使用定时时间常数S5T#。
A I 1.2
FR T0 //允许定时器T1再起动
A I 0.0
L S5T#2s //预置值2s送入累加器1
SP T0 //启动T0
A I 0.1
R T0 //复位T0
L T0 //将T0的十六进制时间当前值装入累加器1
T MW10 //将累加器1的 内容传送到MW10
LC T0 //将T0的BCD时间当前值装入累加器1.
T MW12 //将累加器1的内容传送到MW12
A T0 //检查T0的信号状态
= Q 4.0 //T0的定时器位为1时,Q4.0的线圈通电
仅在语句表中使用的FR指令允许定时器再起动,即控制FR的RLO(I1.2)由0变为1状态时,重新装入定时时间,定时器又从预置值开始定时。再起动只是在定时器的起动条件满足(图3-28中的I0.1=1)时起作用。该指令可以用于所有的定时器,但是它不是起动定时器定时的必要条件。
8.扩展的脉冲定时器
10.接通延时定时器
12.保持型接通延时定时器
14.断开延时定时器线圈
3.4.2 计数器指令
1.计数器的存储器区
每个计数器有一个16位的字和一个二进制位。
计数器字的0~11位是计数值的BCD码,计数值的范围为0~999。二进制格式的计数值只占用计数器字的0~9位。
下面是图3-44中左边的电路对应的语句表:
A I0.0 //在I0.0的上升沿
CU C10 //加计数器C10的当前值加1
BLD 101
A I0.2 //在I0.2的上升沿
L C#6 //计数器的预置值6被装入累加器的低字
S C10 //将预置值装入计数器C10
A I0.3 //如果I0.3为1
R C10 //复位C10
L C10 //将C10的二进制计数当前值装入累加器1
T MW0 //将累加器1的内容传送到MW0
LC C10 //将C10的BCD计数当前值装入累加器1
T MW8 //将累加器1的内容传送到MW8
A C10 //如果C10的当前值非0
= Q 5.0 //Q 5.0为1状态
设置计数值线圈SC(Set Counter Value)用来设置计数值,在RLO的上升沿预置值被送入指定的计数器。CU的线圈为加计数器线圈。在I0.0的上升沿,如果计数值小于999,计数值加1。复位输入I0.3为1时,计数器被复位,计数值被清0。
计数值大于0时计数器位(即输出Q)为1;计数值为0时,计数器位亦为0。
在减计数输入信号CD的上升沿,如果计数值大于0,计数值减1。
3.5.1 装入指令与传送指令
1.装入指令与传送指令
装入(L,Load)指令将源操作数装入累加器1,而累加器1原有的数据移入累加器2。
装入指令可以对字节(8位)、字(16位)、双字(32位)数据迸行操作。
传送(T,Transfer)指令将累加器1中的内容写入目的存储区中,累加器1的内容不变。
2.立即寻址的装入与传送指令
立即寻址的操作数直接在指令中,下面是使用立即寻址的例子。
L -35 //将16位十进制常数-35装入累加器1的低字ACCU1-L
L L#5 //将32位常数5装入累加器1
L B#16#5A //将8位十六进制常数装入累加器1最低字节ACCU1-LL
L W#16#3E4F //将16位十六进制常数装入累加器1的低字ACCU1-L
L DW#16#567A3DC8 //将32位十六进制常数装入累加器1
L 2#0001_1001_1110_0010 //将16位二进制常数装入累加器1的低字ACCU1-L
L 25.38 //将32位浮点数常数(25.38)装入累加器1
L ‘ABCD’ //将4个字符装入累加器1
L TOD#12:30:3.0 //将32位实时时间常数装入累加器1
L D#2004-2-3 //将16位日期常数装入累加器1的低字ACCU1-L
L C#50 //将16位计数器常数装入累加器1的低字ACCU1-L
L T#1M20S //将16位定时器常数装入累加器1的低字ACCU1-L
L S5T#2S //将16位定时器常数装入累加器1的低字ACCU1-L
L P#M5.6 //将指向M5.6的指针装入累加器1
AW W#16#3A12 //常数与累加器1的低字相“与”,运算结果在累加器1的低字中
L B#(100,12,50,8) //装入4字节无符号常数
3.直接寻址的装入与传送指令
直接寻址在指令中直接给出存储器或寄存器的区域、长度和位置,例如用MW200指定位存储区中的字,地址为200;下面是直接寻址的程序实例:
A I0.0 //输入位I0.0的“与”(AND)操作
L MB10 //将8位存储器字节装入累加器1最低的字节ACCU1-LL
L DIW15 //将16位背景数据字装入累加器1的低字ACCU1-L
L LD22 //将32位局域数据双字装入累加器1
T QB10 //将ACCU1-LL中的数据传送到过程映像输出字节QB10
T MW14 //将ACCU1-L中的数据传送到存储器字MW14
T DBD2 //将ACCU1中的数据传送到数据双字DBD2
3.存储器间接寻址
在存储器间接寻址指令中,给出一个作地址指针的存储器,该存储器的内容是操作数所在存储单元的地址。在循环程序中经常使用存储器间接寻址。
地址指针可以是字或双字,定时器(T)、计数器(C)、数据块(DB)、功能块(FB)和功能(FC)的编号范围小于65 535,使用字指针就够了。
其它地址则要使用双字指针,如果要用双字格式的指针访问一个字、宇节或双字存储器,必须保证指针的位编号为0,例如P#Q20.0。
L QB[DBD 10] //将输出字节装入累加器1,输出字节的地址指针在数据双字DBD10中
//如果DBD10的值为2#0000 0000 0000 0000 0000 0000 0010 0000,装入的是QB4
A M[LD 4] //对存储器位作“与”运算,地址指针在数据双字LD4中
//如果LD4的值为2#0000 0000 0000 0000 0000 0000 0010 0011,则是对M4.3进行操作
4.寄存器间接寻址
地址寄存器AR1和AR2,的内容加上偏移量形成地址指针,指向数值所在的存储单元。
其中第0~2位(xxx)为被寻址地址中位的编号(0~7),第3~18位为被寻址地址的字节的编号(0~65535)。第24~26位(rrr)为被寻址地址的区域标识号,第31位x = 0为区域内的间接寻址,第31位x = 1为区域间的间接寻址。
第一种地址指针格式存储区的类型在指令中给出,例如L DBB[AR1, P#6.0]。在某一存储区内寻址。第24~26位(rrr)应为0。
第二种地址指针格式的第24~26位还包含存储区域标识符rrr,区域间寄存器间接寻址。
如果要用寄存器指针访问一个字节、字或双字,必须保证指针中的位地址编号为0。
指针常数#P5.0对应的二进制数为2#0000 0000 0000 0000 0000 0000 0010 1000。下面是区内间接寻址的例子:
L P#5.0 //将间接寻址的指针装入累加器1
LAR1 //将累加器1中的内容送到地址寄存器1
A M[AR1, P#2.3] //AR1中的P#5.0加偏移量P#2.3, 实际上是对M7.3进行操作
= Q[AR1, P#0.2] //逻辑运算的结果送Q5.2
L DBW[AR1, P#18.0] //将DBW23装入累加器1
下面是区域间间接寻址的例子:
L P#M6.0 //将存储器位M6.0的双字指针装入累加器1
LAR1 //将累加器1中的内容送到地址寄存器1
T W[AR1, P#50.0] //将累加器1的内容传送到存储器字MW56
P#M6.0对应的二进制数为2#1000 0011 0000 0000 0000 0000 0011 0000。因为地址指针P#M6.0中已经包含有区域信息,使用间接寻址的指令T W[AR1, P#50]中没有必要再用地址标识符M。
表3-6 寄存器间接寻址的区域标识位
区域标识符 存储区 位26~24
P 外设输入输出 000
I 输入过程映像 001
Q 输出过程映像 010
M 位存储区 011
DBX 共享数据块 100
DIX 背景数据块 101
L 块的局域数据 111
5.装入时间值或计数值
L T5 //将定时器T5中的二进制时间值装入累加器1的低字中
LC T5 //将定时器T5中的BCD码格式的时间值装入累加器1低字中
L C3 //将计数器C3中的二进制计数值装入累加器1的低字中
LC C16 //将计数器C16中的BCD码格式的值装入累加器1的低字中
6.地址寄存器的装入与传送指令
可以不经过累加器1,与地址寄存器AR1和AR2交换数据。下面是应用实例:
LAR1 DBD20 //将数据双字DBD20中的指针装入AR1
LAR2 LD180 //将局域数据双字LD180中的指针装入AR2
LAR1 P#M10.2 //将带存储区标识符的32位指针常数装入AR1
LAR2 P#24.0 //将不带存储区标识符32位指针常数装入AR2
TAR1 DBD20 //AR1中的内容传送到数据双字DBD20
TAR2 MD24 //AR2中的内容传送到存储器双字MD24
梯形图中的传送指令:
A I1.0
JNB _001 //如果I1.0 = 0,则跳转到标号_001处
L MW2 //MW2的值装入累加器1的低字
T MW4 //累加器1低字的内容传送到MW4
SET //将RLO置为1
SAVE //将RLO保存到BR位
CLR //将RLO置为0
_001: A BR
……
如果功能被正确执行,BR位为 1,ENO也为 1。
3.5.2 比较指令
比较指令用于比较累加器1与累加器2中的数据大小,被比较的两个数的数据类型应该相同。如果比较的条件满足,则RLO为1,否则为0。状态字中的CC0和CC1位用来表示两个数的大于、小于和等于关系(见表3-7)。
表3-7 指令执行后的CC1和CC0
CC1 CC0 比较指令 移位和循环移位指令 字逻辑指令
0 0 累加器2=累加器1 移出位为0 结果为0
0 1 累加器2<累加器1 - -
1 0 累加器2>累加器1 - 结果不为0
1 1 非法的浮点数 移出位为1 -
表3-8 比较指令
语句表指令 梯形图中的符号 说明
? I? D? R CMP ? ICMP ? DCMP ? R 比较累加器2和累加器1低字中的整数,如果条件满足,RLO=1比较累加器2和累加器1中的双整数,如果条件满足,RLO=1比较累加器2和累加器1中的浮点数,如果条件满足,RLO=1
?可以是==, <>, >, <, >=, <=。
下面是比较两个浮点数的例子:
L MD4 //MD4中的浮点数装入累加器1
L 2.345E+02 //浮点数常数装入累加器1,MD4装入累加器2
>R //比较累加器1和累加器2的值
= Q4.2 //如果MD4 > 2.345E+02,则Q4.2为1
梯形图中的方框比较指令可以比较整数(I)、双整数(D)和浮点数(R)。方框比较指令在梯形图中相当于一个常开触点,可以与其他触点串连和并联。
表3-9 数据转换指令
语句表 梯形图 说明
BTIITBBTDDTBDTRITDRNDRND+RND-TRUNC BCD_II_BCDBCD_DIDI_BCDDI_RI_DIROUNDCEILFLOORTRUNC 将累加器1中的3位BCD码转换成整数将累加器1中的整数转换成3位BCD码将累加器1中的7位BCD码转换成双整数将累加器1中的双整数转换成7位BCD码将累加器1中的双整数转换成浮点数将累加器1中的整数转换成双整数将浮点数转换为四舍五入的双整数将浮点数转换为大于等于它的最小双整数将浮点数转换为小于等于它的最大双整数将浮点数转换为截位取整的双整数
CAWCAD -- 交换累加器1低字中两个字节的位置交换累加器1中4个字节的顺序
下面是双整数转换为BCD码的例子:
A I0.2 //如果I0.2为1
L MD10 //将MD10中的双整数装入累加器1
DTB //将累加器1中的数据转换为BCD码,结果仍在累加器1中
JO OVER //运算结果超出允许范围(OV=1)则跳转到标号OVER处
T MD20 //将转换结果传送到MD20
A M4.0
R M4.0 //复位溢出标志
JU NEXT //无条件跳转到标号NEXT处
OVER: AN M4.0
S M4.0 //置位溢出标志
NEXT: ……
【例3-5】 将101英寸转换为以厘米为单位的整数,送到MW0中。
L 101 //将16位常数101(65H)装入累加器1
ITD //转换为32位双整数
DTR //转换为浮点数101.0
L 2.54 //浮点数常数2.54装入累加器1,累加器1的内容装入累加器2
*R //101.0乘以2.54,转换为256.54厘米
RND //四舍五入转换为整数257(101H)
T MW30
7.取反与求补指令
表3-12 取反与求补指令
语句表指令 梯形图指令 说明
INVIINVDNEGINEGDNEGR INV_IINV_DINEG_INEG_DINEG_R 求累加器1低字中的16位整数的反码求累加器1中双整数的反码求累加器1低字中的16位整数的补码求累加器1中双整数的补码将累加器1中的浮点数的符号位取反
L MD20 //将32位双整数装入累加器1
NEGD //求补
T MD30 //运算结果传送到MD30
表3-13 取反与求补
内容 累加器1的低字
变换前的数 0101 1101 0011 1000
取反的结果 1010 0010 1100 0111
求补的结果 1010 0010 1100 1000