Download presentation
Presentation is loading. Please wait.
Published byOla Magnusson Modified 5年之前
1
数字指令 CMP ==I IN1 IN2 M0.0 Q 5.7 IW0 IW2 T4 I0.7 S_ODT Q4.5 S5T#35s MW0
TV S Q BCD BI R I0.7 I0.5 S5T#35s Q4.5 MW0 QW6 目录 页 数据格式 (16 位) 数据格式 (32 位) 数据装入和传递 (1) …… 数据装入和传递 (2) …… 数据装入和传递 (3) …… 定时器: STEP 7中S5定时器时间格式 定时器: 接通延时 (SD) ………… 定时器: 带保持接通延时(SS) ………………… 定时器: 关断延时 (SF) ………… 定时器: 脉冲 (SP) 定时器: 扩展脉冲 (SE) … 定时器: 位指令 … 练习 STEP 7 中的S5 计数器 计数器: 位指令 计数器: 功能图 练习: 瓶装线编程 (循环灌装和瓶子计数) ………… 转换操作 BCD <-> 整数 … 转换操作I -> DI -> REAL …… 比较操作 数字逻辑操作 基本数学功能 …………… 练习: 瓶装线编程 (产量数据) …… 练习: 瓶装线编程 (包装数) …………… 移位操作 (字/双字) … 有符号整数右移位 …………………… 双字循环移位操作
2
数据格式 (16 位) PG CPU BCD W#16#296 1 整数 +296 28 1 25 23 BCD W#16#F413 1
1 2 9 6 符号 (+) 正数 整数 +296 28 = 1 25 32 + 23 8 = 296 BCD W#16#F413 1 4 3 符号 (-) 负数 BCD 码 十进制数的每一位用四个二进制位表示,因为最大的数是9,所以需要四位才能表示出来( 1001)。 从0到9的十进制数的BCD码表示与二进制数表示相同。 整数 数据类型INT 是整数 (16 位)。 符号 (位15) 表示数是正数或是负数 (“0” = 正数,“1” = 负数)。 16位整数的范围是 ~ 在二进制格式中,整数的负数形式用正数的二进制补码表示。(二进制补码利用取反加1得到) 负数的位格式,对零的位置加权求和,再加1,然后在前面放一个负号。 整数 -413 27 = 128 + 1 23 8+ 22 4 = 412 28 256+ 24 16+ - ( ) = - 413
3
数据格式 (32 位) 1 1 28 25 23 实数的通用格式 = (Sign) • (1.f) • (2e-127) 1 20 21
BCD 符号 (+) 1 2 9 6 DW#16#296 DINT 1 L#+296 28 = 25 32 + 23 8 = 296 整数 (32 位) = REAL 实数 符号 e = 指数 (8 Bit) f = 底数 (23 Bit) 实数的通用格式 = (Sign) • (1.f) • (2e-127) +0.75 或 +7.5 E-1 DINT 带符号的32-位整数,定义为“双整数”或“长整数”。 范围: L# ~ L# REAL 实数(也称浮点数)是 x10-38 ~ 3, x 1038 之间的正数或负数。 例如: 或 E 或 E5. 指数表示中的指数是以10为底的。 在存储器中实数占用两个字,最高有效位是符号位。其他位是指数和底数。 注:STEP 7中的实数是按照 IEEE 标准表示的。 1 20 21 22 23 24 25 26 27 2-23 2-1 2-2 2-3 实数 = +1,5 * = 0,75
4
数据装入和传递 (1) LAD FBD L +5 T MB5 STL L +5 // 16-位常数 (整数)
MOVE EN OUT ENO MB5 LAD IN 5 MOVE EN IN OUT ENO MB5 5 FBD L +5 T MB5 STL 装载 举例 L // 16-位常数 (整数) L L# // 32-位常数 (双整数) L B#16#EF // 十六进制字节 L 2# // 16-位二进制值 L // 32-位常数 (实数) MOVE (LAD/FBD) 如果输入 EN 有效,输入“IN”处的值拷贝到输出“OUT”。 “ENO”与“EN”的状态相同。 L 和 T (STL) 装载和传递指令的执行与RLO无关,数据通过累加器交换。 装载指令把右边源地址中的值写到累加器1,用“0”补充其它的位 (共32 位)。 传递指令拷贝累加器中一些或所有内容到指定目的地址 (见下页)。
5
数据装入和传递 (2) ACCU1 内容 ACCU2 内容 : L W#16#CAFE L W#16#AFFE : 程序 X X X X X
Y : L W#16#CAFE C A F E X ACCU1 ACCU 1是CPU中的中央寄存器,当执行装入指令时,要装入的值被写入ACCU1;对于传输指令,要传输的值从ACCU1读出。数学功能、移位和循环移位的结果也放在 ACCU 1。 ACCU2 当执行装载指令时, ACCU 1中的旧值先移到ACCU 2,在新值写入ACCU1前它先被清零。 ACCU 2 也用于比较操作,数字逻辑操作、数学和移位操作。这些操作在后面详细介绍。 L W#16#AFFE : A F E C A F E
6
数据装入和传递 (3) L MB 0 L MW 0 L MD 0 T QD 4 T QW 4 T QB 4 装载 传递 ACCU1内容 程序
31 23 15 7 MB0 L MB 0 装载 31 23 15 7 MB1 MB0 L MW 0 31 23 15 7 MB3 MB2 MB0 MB1 L MD 0 T QD 4 QD 4 传递 概述 累加器是CPU中的辅助存储器,它们用于不同地址之间数据交换、比较和数学运算操作。 S7-300 有两个32位的累加器,S7-400 有四个32位的累加器。 装载 装载指令把指定字节、字或双字中的内容装入ACCU 1。 传递 当传递指令执行时,ACCU 1中的内容保持不变。相同的信息可以传到不同的目的地址。如果仅传递一个字节,只使用右边的8位 (见图)。 RLO 在LAD 和 FBD 中,可以使用MOVE的允许输入 (EN) 把装载和传递操作和RLO联系起来。 在STL 中,总是执行装入和传递操作,而和RLO无关。但是,利用条件跳转指令来执行和RLO有关的装入和传递功能。 T QW 4 QW 4 T QB 4 QB 4
7
定时器:STEP 7中S5定时器时间格式 时间设定值格式 系统数据存储器中定时器单元 “L T...”后的ACCU 内容
102 101 100 时间设定值格式 X 时基 时间值 (BCD 码) 系统数据存储器中定时器单元 X 时基 时间值 (二进制数) “L T...”后的ACCU 内容 X 时间值(二进制数) 时间指定 1. 固定的时间值指时间常数 (例如:S5T#100ms, S5T#35s, S5T#5m2s200ms, S5T#2h2m2s50ms)。 2. 时间值由操作人员用拨轮按钮可变。 3. 和存储器字或数据字中的时间值有关的过程或配方。 定时器单元 CPU中为定时器保留的一个特殊存储器区。这个区为每个定时器地址保留一个16-位字。 定时器字的位 0 到 9 包含用二进制码表示的时间值。 当定时器刷新时,时间值由时间基准定义的时间间隔决定。 时间基准 定时器字的位12 和 13 包含用二进制码表示的时间基准: 0 = 10 ms 1 = 100 ms 2 = 1 s 3 = 10 s. 时间基准定义一个单位代表的时间间隔。 当时间用常数(S5T#...)表示时,时间基准自动由系统自动分配。如果时间由拨码按钮或通过数据接口指定,用户必须指定时间基准。 L / BI 在“BI”输出端的地址包含10位二进制数表示的时间值 (不带时间基准!)。 LC / BCD 在“BCD”输出端的地址包含三位的BCD数(12位)和时间格式(位12和13)。 注 在STEP 7也实现IEC允许的定时器。 在高级编程课中讨论利用系统功能块实现 IEC 定时器。 102 101 100 “LC T...”后的ACCU 内容 X 时基 时间值 (BCD 码)
8
定时器:接通延时 (SD) LAD FBD STL A I0.7 L S5T#35s SD T4 A I0.5 R T4 L T4
S_ODT TV S Q BCD BI R I0.7 I0.5 S5T#35s Q4.5 MW0 QW6 FBD S_ODT TV Q BI R I0.7 I0.5 S5T#35s MW0 QW6 T4 BCD = Q4.5 S STL A I0.7 L S5T#35s SD T4 A I0.5 R T4 L T4 T MW0 LC T4 T QW6 A T4 = Q4.5 S处的RLO R处的RLO 定时器 操作 例如 启动 当定时器的“S”输入端的 RLO从“0”变到“1”时,定时器启动。只要输入 S=1,定时器定时起作用,当到达指定的TV值时定时器启动。 复位 当复位输入R的 RLO= “1” 时,就清除定时器中的定时值,而且输出Q复位。 数字输出 当前时间值可以在BI输出端以二进制数读出,在BCD输出端以BCD码形式读出。 当前时间值是TV的初值减定时器启动以来的经过时间。 位输出 当定时器时间到达,没有错误而且输入S= “1”时, 输出“Q” 的信号变为“1”。 如果在定时时间到达前输入端S从“1”变到“0”,定时器停止运行,这时输出Q= “0” 。 Q S5TIME 数据类型 0,01s <-- 0,1s <-- 1s <-- 10s <-- 1 时间值:
9
定时器: 带保持接通延时 (SS) LAD FBD STL T4 S_ODTS TV S Q BCD BI R I0.7 I0.5
S5T#35s Q4.5 MW0 QW6 FBD S_ODTS TV Q BI R I0.7 I0.5 S5T#35s MW0 QW6 T4 BCD = Q4.5 S STL A I0.7 L S5T#35s SS T4 A I0.5 R T4 L T4 T MW0 LC T4 T QW6 A T4 = Q4.5 例如 S处的RLO R处的RLO 定时器 操作 Q 启动 当定时器的“S”输入端的RLO从“0”变到“1”时,定时器启动。即使定时过程中出现输入S=0,定时器从输入TV设定的时间开始定时。 当定时器运行时,如果启动输入再次从“0”变到“1” 定时器重新开始。 复位 当复位输入R的 RLO=1时,就清除定时器中的定时值,而且输出Q复位。 位输出 当定时器时间到达而且没有错误,输出“Q”的信号变为“1”,和输入端S的信号无关。
10
定时器:关断延时 (SF) LAD FBD STL T4 S_OFFDT TV S Q BCD BI R I0.7 I0.5 S5T#35s
MW0 QW6 FBD S_OFFDT TV Q BI R I0.7 I0.5 S5T#35s MW0 QW6 T4 BCD = Q4.5 S STL A I0.7 L S5T#35s SF T4 A I0.5 R T4 L T4 T MW0 LC T4 T QW6 A T4 = Q4.5 例如 S处的RLO R处的RLO 定时器 操作 Q 启动 当定时器的S输入端的RLO从“1”变到“0”时,定时器启动。当时间到达时,输出信号Q=0。 当定时器运行时,如果输入 S 的状态从“0”变到“1”,定时器停止运行。下次当 S 从“1”变到“0”时,它重新启动。 复位 当复位输入R的RLO=1时,就清除定时器中的定时值,而且输出Q复位。 如果两个输入 (S 和 R) 都有信号“1”,不置位输出Q,直到优先级高的复位取消为止。 位输出 当输入端 S 处的RLO从“0”变到“1”时,输出Q =1,如果输入S取消,输出 Q 继续保持“1”,直到设定的时间到达。
11
定时器:脉冲 (SP) LAD FBD STL MW0 T4 S_PULSE TV S Q BCD BI R I0.7 I0.5
S5T#35s Q4.5 QW6 FBD S_PULSE TV Q BI R I0.7 I0.5 S5T#35s MW0 QW6 T4 BCD = Q4.5 S STL A I0.7 L S5T#35s SP T4 A I0.5 R T4 L T4 T MW0 LC T4 T QW6 A T4 = Q8.5 S处的RLO R处的RLO 定时器 操作 Q 例如 启动 当“S”输入端从“0”变到“1”时,启动定时器,输出“Q”也置为“1”。 复位 下面情况下输出“Q”复位: • 定时器定时时间到,或 • 启动信号从“1”变到“0”,或 • 复位输入“R”有信号“1”。
12
定时器:扩展脉冲 (SE) LAD FBD STL T4 S_PEXT TV S Q BCD BI R I0.7 I0.5 S5T#35s
MW0 QW6 FBD S_PEXT TV Q BI R I0.7 I0.5 S5T#35s MW0 QW6 T4 BCD = Q4.5 S STL A I0.7 L S5T#35s SE T4 A I0.5 R T4 L T4 T MW0 LC T4 T QW6 A T4 = Q4.5 S处的RLO R处的RLO 定时器 操作 Q 启动 当 S 输入端的RLO从“0”变到“1”时,定时器启动。输出 Q 被置位“1”。 即使 S 输入变到“0”,输出 Q 仍保持“1”。 当定时器正在运行时,如果启动输入信号从“0”变到“1”,定时器被再次启动。 复位 在如下情况下输出“Q”被复位: • 定时器时间到,或 • 复位输入“R”有信号“1”。 例如
13
定时器:位指令 LAD FBD A I0.0 L S5T#5s SD T4 A T4 = Q 4.0 A I0.1 R T4 STL
Network 1: Network 2: Network 3: LAD & SD T4 I0.0 S5T#5s = Q 4.0 I0.1 TV R FBD A I0.0 L S5T#5s SD T4 A T4 = Q 4.0 A I0.1 R T4 STL 位指令 所有的定时器也可以用简单的位指令启动,这种方法和前面讨论的定时器功能的相似处和不同之处如下: • 相似处: - 启动条件在“S”输入 - 指定时间值 - 复位条件在“R”输入 - 信号响应在输出“Q” • 不同 (对 LAD 和 FBD): - 不能检查当前时间值 (没有BI 和BCD 输出)。
14
练习 T4 S_PULSE S TV R BI BCD Q I 0.7 S5T#5s I 0.5 Q 4.0 Q4.0 5s T4 S_PEXT S TV R BI BCD Q I 0.7 S5T#5s I 0.5 Q4.0 T4 S_ODT S TV R BI BCD Q I 0.7 S5T#5s I 0.5 Q 4.0 Q4.0 T4 S_ODTS S TV R BI BCD Q I 0.7 S5T#5s I 0.5 Q 4.0 Q4.0 练习 完成上面幻灯片中的定时器功能图! I 0.7 I 0.5 Q4.0 T4 S_OFFDT S TV R BI BCD Q S5T#5s Q 4.0
15
STEP 7中的S5计数器 LAD FBD STL A I0.4 CU C5 A I0.5 CD C5 A I0.3 L C#20 S C5
R C5 L C5 T MW4 LC C5 T QW6 A C5 = Q4.3 Q I 0.4 I 0.5 CU I 0.7 C#20 S_CUD CD S I 0.3 PV R Q 4.3 CV CV_BCD MW 4 QW 6 C5 Q I 0.4 I 0.5 CU I 0.7 C#20 S_CUD CD S I 0.3 PV R Q 4.3 CV CV_BCD MW 4 QW 6 C5 = 计数器值 在系统数据存储器中为每个计数器保留了一个16-位字,它用来以二进制格式存储计数器的值( )。 加计数 当“CU”输入端的RLO 从“0”变到“1”时,计数器的当前值加1(最大值=999). 减计数 当“CD”输入端的RLO 从“0”变到“1”时,计数器的当前值减1(最小值=0). 置数计数器 当“S”输入端RLO从“0”变到“1”时,计数器就设定为“PV”输入的值。 清零计数器 当“R”输入端RLO = 1,计数器的值置为0。如果复位条件满足,计数器不能置数,也不能计数。 PV 在“PV”输入端,用BCD码指定设定值 ( ) : • 用常数 (C#...) • 通过数据接口用BCD 格式 CV / CV_BCD 计数器值用二进制数或BCD数装入累加器,再传递到其他地址。 Q 计数器状态在输出“Q”检查: • 计数值 = 0 -> Q = 0 • 计数值 >< 0 -> Q = 1 计数器类型 • S_CU = 加计数器 (仅加计数) • S_CD = 减计数器 (仅减计数) • S_CUD = 加/减计数器
16
计数器:位指令 LAD FBD STL A I0.0 L C#20 S C5 A I0.1 CU C5 A I0.2 CD C5 A C5
Network 1: Network 2: I0.1 CU Network 3: I0.2 CD Network 4: Q 4.0 FBD SC C5 I0.0 C#20 CV CU I0.1 CD I0.2 = Q 4.0 STL A I0.0 L C#20 S C5 A I0.1 CU C5 A I0.2 CD C5 A C5 = Q 4.0 位指令 所有的计数器功能也可以用简单的位指令操作。这种方法和前面讨论的计数器功能的相似处和不同之处如下: • 相似处: - 设定条件在输入“SC” - 指定计数器值 - “CU” 输入处RLO 变化 - “CD” 输入处RLO 变化 • 不同之处: - 不能检查计数器当前值 (没有BI 和 BCD 输出)。 - 没有图形表示中的位输出 Q。 . 注 在STEP 7中也可实现 IEC允许计数器。 在高级编程课中讨论采用系统功能块实现 IEC计数器。
17
计数器:功能图 CU CD S R 5 4 计数 3 注 如果计数器加计数达到999,或减计数达到0,那麽,计数值就保持不变,不对计数脉冲反应。 如果加计数和减计数同时输入,计数器保持不变。 2 1 Q
18
练习:瓶装线编程 (灌装循环和瓶子计数) M 设备 ON/OFF: I 0.0 = 启动 (瞬态常开触点) 主容器
练习:瓶装线编程 (灌装循环和瓶子计数) 设备 ON/OFF: I 0.0 = 启动 (瞬态常开触点) I 0.1 = 停止 (瞬态常闭触点) 主容器 手动/自动模式: I 0.4 = 手动 /自动 I 0.5 = 接受模式 I 0.2 = 向前点动 Q 5.0 灌装漏斗 瓶子传感器 I 8.7 I 0.3 = 向后点动 瓶子传感器 I 8.6 瓶子传感器 I 8.5 目的 给瓶子灌装程序加入一个新功能,除已经编程的手动模式(FC15),建立一个自动模式程序。 自动模式的 在自动模式下,当传送带电机 ( Q 8.5) 接通时,它一直保持接通直到 传送带控制 用停止开关(I 0.1) 或传感器 (I 8.6) 检测到瓶子。当瓶子已经装满,传送带自动启动向前运动,一直到检测到另一个瓶子或操作STOP开关。 瓶子灌装 当在灌装漏斗(I 8.6 =1)下检测到瓶子时,灌装开始。灌装用3秒和输出Q 5.0指示模拟。 瓶子计数 另外两个传感器提供满瓶和空瓶检查。瓶子传感器I 8.5 检查空瓶,瓶子传感器 I8.7检查数满瓶。 当瓶装线运行后,开始对空瓶和满瓶计数 (C1 用于空瓶,C2 用于满瓶) ,满瓶数显示在数码管上QW 6。 操作 1. 在FC 16中写一个程序,在OB1(项目“My Project”下程序“FILL”中)中调 用FC16。 必须修改FC 15中包含传送带向前点动的程序段。 2. 在培训设备上测试你的程序。 结果 它应该工作正常。 M Q 8.5 传送带向前 Q 8.6 传送带向后
19
转换操作 BCD <-> 整数 0 8 1 5 2 4 8 LAD FBD L IW4 BTI T MW20 L MW10
转换 BCD->整数 有数学运算的 用户程序 用BCD码输入 的数 任务 2 4 8 转换 BCD<-整数 用BCD码显示 的数 IN BCD_I EN ENO OUT IW4 MW20 I_BCD MW10 QW6 LAD IN BCD_I EN ENO OUT IW4 MW20 I_BCD MW10 QW6 FBD L IW4 BTI T MW20 L MW10 ITB T QW6 STL 例 用户程序利用拨轮按钮输入的值执行数学功能,并把结果显示在数据显示窗中。数学功能不能用BCD格式执行,所以必须转换格式。 转换指令 S7-300/400 指令集支持多种转换功能,指令都有相同的格式: EN, ENO 如果在允许输入EN处的 RLO =1,就执行转换。允许输出 ENO 总是和EN的状态相同。如果不是这样,在相关指令中指出。 IN 当EN=1时,IN处的值读入转换指令。 OUT 转换的结果保存在OUT输出的地址中。 BCD_I / BTI (BCD 转换到整数) 以三位BCD码数(+/- 999)读入IN参数,把它转换成一个整数 (16 位)。 I_BCD / ITB (整数转换到 BCD) 以整数形式(16位)读入IN参数,把它转换成一个三位BCD码数 (+/- 999),如果出现溢出,ENO = 0。 BCD_DI / BTD 把BCD 码数 (+/ ) 转换成双整数 (32 位)。 DI_BCD / DTB 把双整数转换成一个7位BCD码数 (+/ ),如果出现溢出,ENO = 0。
20
转换指令 I -> DI -> REAL
整数格式的数据(16 位) 带有实数的 运算程序 任务 从整数到双整数 的转换 从双整数到实数 的转换 IN I_DI EN ENO OUT MW12 MD14 DI_R MD26 F B D STL L MW12 ITD DTR T MD26 LAD IN DI_R EN ENO OUT MD14 MD26 I_DI MW12 例 使用整数的用户程序也需要执行除法,可能出现结果小于1。由于这些值只能用实数表示,所以需要转换到实数。这样,首先需要把整数转换成双整数。 I_DI / ITD 整数到双整数转换。 DI_R / DTR 双整数到实数转换。 注 其他转换指令,例如: • INV_I / INVI • NEG_I / NEGI • TRUNC / TRUNC • ROUND / RND • CEIL / RND+ • FLOOR / RND- • INV_DI / INVD • NEG_DI / NEGD • NEG_R / NEGR • CAW,CAD 在高级编程课中详细讨论。
21
比较指令 LAD CMP ==I IN1 IN2 IW0 IW2 FBD IN1 IN2 M0.0 IW0 IW2 Q5.7 CMP ==I
& = Q5.7 CMP ==I STL A M0.0 A ( L IW0 L IW2 ==I ) = Q5.7 CMP 利用比较指令比较下面的数值: I 比较整数 (16位定点数) D 比较整数 (32位定点数) R 比较浮点数(32 位= IEEE 格式浮点数)。 如果比较结果为“真”,则操作的RLO=1,否则RLO=0。 用指定的条件比较输入IN1和IN2端的值: == IN1 等于 IN2 <> IN1 不等于IN2 > IN1 大于 IN2 < IN1 小于 IN2 >= IN1 大于等于 IN2 <= IN1 小于等于 IN2.
22
数字逻辑指令 L IW 0 L W#16#5F2A AW / OW / XOW T MW10 WXOR_W WOR_W WAND_W EN
ENO IN2 OUT W#16#5F2A MW10 IN1 IW0 15 IW0 = 1 1 1 1 W#16#5F2A = 1 1 1 1 1 1 1 1 1 AND OR XOR AW 后的MW10 1 WAND_W “字与”指令对输入IN1和IN2处的数值相应位用“与”真值表运算。操作结果存放在输出OUT的地址。 当EN=1时,执行该指令。 例如,屏蔽拨轮按钮的第4个数: IW 2= = W#16#0FFF = MW30 = WOR_W “字或”指令对输入IN1和IN2处的数值相应位用“或”真值表运算。操作结果存放在输出OUT的地址。 当EN=1时,执行该指令。 例如,置位MW32中的第0位 : MW32 = W#16#0001 = MW32 = WXOR_W “字异或”指令对输入IN1和IN2处的数值相应位用“异或”真值表运算。操作结果存放在输出OUT的地址。 当EN=1时,执行该指令。 例如,检测IW0中的信号变化: IW0 = MW28 = MW24 = OW 后的MW10 1 XOW 后的MW10 1
23
基本数学功能 LAD FBD STL L MW4 L MW10 + I T MW6 L MW5 L MW11 - I T MW7 L MD6
ADD_I IN2 EN ENO OUT IN1 MW4 MW6 加法 减法 SUB_I IN2 EN ENO IN1 MW5 MW11 MW7 OUT L MW5 L MW11 - I T MW7 乘法 MD6 MD12 MUL_R EN ENO IN1 MD66 IN2 OUT L MD6 L MD12 * R T MD66 概述 S7-300/400 指令集支持多种转换功能,所有指令都有相同的格式: EN 如果在允许输入EN处的 RLO =1,就执行转换。 ENO 如果结果超出了数据类型允许的范围,溢出位 OV=“Overflow”和 OS=“Stored Overflow”被置位,允许输出ENO=0。这可以防止和ENO有关的指令继续执行。 IN1,IN2 IN1处的值作为第一个地址读入,IN2处的值作为第二个地址读入。 OUT 数学操作的结果存储在输出OUT的地址处。 指令 加法: ADD_I 整数加法 ADD_DI 双整数加法 ADD_R 实数加法 减法: SUB_I 整数减法 SUB_DI 双整数减法 SUB_R 实数减法 乘法: MUL_I 整数乘法 MUL_DI 双整数乘法 MUL_R 实数乘法 除法: DIV_I 整数减法 DIV_DI 双整数减法 DIV_R 实数减法 注 高级数学功能 (ABS, SQR, SQRT, LN, EXP, SIN, COS, TAN, ASIN, ACOS, ATAN) 在高级编程课中讨论。 除法 MD40 MD4 EN ENO IN1 IN2 MD32 OUT DIV_R L MD40 L MD4 / R T MD32
24
练习:瓶装线编程 (产量数据) 空瓶 MW 100 满瓶 MW 102 “碎” 瓶 MW 104 目的 扩展瓶子计数功能。
目的 扩展瓶子计数功能。 计数器的最大计数范围是999,为了扩大计数值,可以把计数器串联。 应该使用数学操作进行计数。图中显示的产量数据也是管理所要求的。 操作 1. 删除FC 16中的“瓶子计数”段。 2. 写一个FC18完成计数功能,当装置启动后,在MW 100/102/104中的值要删 除。 当检测到 I 8.5 或 I 8.7 的边沿时,瓶子计数加1。 满瓶和空瓶的差数存放在 MW 104。 3. 在OB1中编一个FC18调用。 4. 下载S7程序“FILL”的所有块到CPU,测试程序。
25
练习:瓶装线编程 (包装数量) 目的 把下面有关瓶装线产量数据加到程序中: • 满瓶以6个为单位打一个包装,包装数需要计算并要显示在QW6.
练习:瓶装线编程 (包装数量) 目的 把下面有关瓶装线产量数据加到程序中: • 满瓶以6个为单位打一个包装,包装数需要计算并要显示在QW6. • 在FC19中写一个程序处理这个任务。 操作 1. 在FC19 (S7-程序FILL) 中写一个程序,把满瓶数除以6。 2. 把结果转换成BCD。 3. 把BCD 值传到数据显示 QW6。 4. 在FC 18中,删除显示满瓶数的段。 5. 在OB1中编写一个FC19的调用。 6. 保存程序,下载并调试。 结果 每完成6个满瓶,数码显示的数(包装数)加1。
26
移位指令 (字 / 双字) L MW8 L MW4 SLW L MW4 T MW12 SLW 2 T MW12 SHL_W EN N OUT
ENO MW12 IN MW4 MW8 = +2 L MW8 L MW4 SLW T MW12 L MW4 SLW 2 T MW12 或: 1 OUT IN 左移字: OUT 1 IN 右移字: Shift 如果在允许输入EN处的 RLO =1,就执行指令。 SHL_W / SLW SHL_W 指令把累加器的位0~位15向左移动输入“N”指定的位数。右面的位用“0”填充。 SHR_W / SRW SHR_W指令把累加器的位0~位15向右移动输入“N”指定的位数。左面的位用“0”填充。 ACCU1-H 累加器的位 16 ~ 位31 不受影响。 OUT 操作的结果存放在输出OUT的地址处。 N 允许范围 N=0...15,如果 N>=16, OUT=0。 ENO 如果指令执行 (EN = 1),ENO 指示最后被移出的位的状态。 这就是说,如果最后被移出的位=“0”,其他和ENO相连的指令(级联) 不执行。 SHL_DW / SLD SHL_DW 或 SHR_DW 的操作过程与SHL_W 或 SHR_DW 指令类似,只不过ACCU1 SHR_DW / SRD ( 位 0 ~ 31) 的所有位都按指定的位数向左/右移动。 EN0 =1 EN0 = 0
27
有符号整数右移位 L MW8 L MW4 SSI L MW4 T MW12 SSI 3 T MW12 SHR_I EN N OUT EN0
IN MW4 MW8 = +3 L MW8 L MW4 SSI T MW12 L MW4 SSI 3 T MW12 或: 有符号整数右移: 1 OUT IN 1 OUT IN SHR_I / SSI 有符号整数向右移位指令只把 ACCU1-L (位 0 ~ 15) 的位向右移动。空出的位用符号位(位15)填充。 位16 ~ 31 不受影响。输入 N 指定要移动的位数。如果N 大于16,就认为N=16。 EN/ENO 如果指令执行 (EN = 1), ENO 指示最后移出的位的状态 (这个位和状态字中的 CC1 和 RLO 有关)。这就是说,如果最后被移出的位=“0”,其他和ENO相连的指令(级联) 不执行。 SHR_DI / SSD 有符号双字右移指令把ACCU 1 (位 0 ~ 31) 的所有位向右移动指定的位数。 N的允许值:0 ~ 32. 注 移位指令的详细内容在高级编程课中讨论。 EN0 = 0 EN0 = 1 1
28
双字循环移位指令 L MW6 L MD2 RLD L MD2 T MD12 RLD 4 T MD12 ROL_DW 或: ENO EN
OUT ENO MD12 IN MD2 MW6 = +4 L MW6 L MD2 RLD T MD12 L MD2 RLD 4 T MD12 或: 1 IN: ROL_DW / RLD 双字循环左移指令把ACCU1中的内容循环地向左移动,空出的位用被移出的位 填充。 最后移出的位被装入状态字的CC1和ENO。这就是说,如果最后被移出的位=“0”,其他和ENO相连的指令(级联)不执行。 ROR_DW / RRD 双字循环右移。 注 在高级编程课中详细讨论循环指令。 向左循环移动 4位: 1 OUT: 1
Similar presentations