工作:三菱PLC R系列的程序、子程序及中断程序
工作:三菱PLC R系列程序扫描与子程序、中断程序
- Ⅰ、理论
- 一、程序的执行
- 扫描流程构成
- 1. 初始处理及RUN时初始化处理
- 2. I/O刷新
- 3. 程序的运算
- 4. END处理
- 二、数据通信及输入输出处理
- (一)数据通信
- (二)输入输出处理及响应延迟
- 1.刷新方式
- 2.直接方式
- 3. 刷新方式和直接方式的对比
- (三)刷新方式
- 1. 详细内容
- 2. 响应延迟
- (四)直接方式
- 1. 详细内容
- 2. 响应延迟
- 三、程序的类型
- (一)初始处理类的程序
- (二)扫描类型的程序
- (三)恒定周期间隔触发类的程序
- 1. 恒定周期间隔的设置
- 2. 执行条件成立时
- ■ 通过EI指令置为中断允许状态之前执行条件成立的情况下
- ■ 在链接刷新程序执行中发生了恒定周期执行类的程序中断被触发的情况下
- ■ 执行恒定扫描时的END处理后的等待时间中,发生了恒定周期执行类的程序中断被触发的情况下
- ■ 恒定周期执行类的程序在执行中发生了其他类型程序中断被触发的情况下
- 3.恒定周期执行模式
- **■ 恒定周期执行模式的动作**
- **■ 恒定周期执行模式的设置**
- **■ 从扫描周期开始的延迟限制值设定**
- (四)事件触发类的程序
- 1. 触发类型
- ■ 通过中断指针(I)触发执行的中断程序
- ■ 位数据的ON(TRUE)来触发的程序
- ■ 经过一定时间之后触发的中断程序
- 2. 触发设置
- (五)待机类程序
- 1. 通过参数设置进行的方法
- 2. 通过指令进行更改程序执行的方法
- (六)程序刷新的组设置
- 1. 程序刷新的组设置
- 2. 各模块的刷新设置
- 四、子程序
- 五、指针(P)
- (一)全局指针
- 1. 全局指针的点数计算
- (二)局部指针
- 1. 局部指针点数计算
- (三)指针设置
- 六、中断程序
- (一)发生中断触发时的响应
- 1. 链接刷新中发生了中断原因的情况下
- 2. 中断禁止(DI)中发生了中断触发的情况下
- 3. 中断程序执行中发生了同一中断信号的情况下
- 4. STOP/PAUSE状态下发生了中断原因的情况下
- (二)设置中断周期
- (三)指令执行中的中断允许
- (四)中断程序启动时的处理
- 1. 文件寄存器(R)块No.的保存/恢复
- 2. 变址寄存器(Z、LZ)的保存/恢复
- (五)多重中断功能
- 1. 中断优先度
- 2. 中断优先度设置
- 3. 指定的优先度及其以下的中断禁止/允许
- 4. 多重中断的执行顺序
- (六)注意事项
- 1. 创建程序时的限制
- 2. 关于使用FB/FUN时的中断处理
- 七、程序执行流程
- 八、本文理论引用
- Ⅱ、实操之(中断)程序触发
- 一、创建恒定周期间隔触发类型的程序
- (一)创建恒定周期间隔触发类型的程序
- 1. 创建扫描类程序
- 2. 创建恒定周期间隔触发类的程序文件
- 3. 扫描程序与恒定周期触发程序类型设定
- 4. 在扫描类程序建立允许恒定周期中断触发代码
- 5. 恒定周期间隔触发的程序代码
- 6. 模拟运行
- 二、创建事件触发类的程序
- (一)位数据的ON(TRUE)触发的中断程序
- 1. 创建扫描类程序
- 2. 创建事件触发类的程序文件
- 3. 扫描程序与事件触发类型【位数据的ON(TRUE)来触发】程序设定
- 4. 在扫描类程序建立允许位数据的ON(TRUE)中断触发的代码
- 5. 事件触发类型【位数据的ON(TRUE)来触发】程序代码
- 6. 模拟运行
- (二)中断指针(I)触发执行的中断程序
- 1. 创建扫描类程序
- 2. 创建事件触发类的程序文件
- 3. 扫描程序与事件触发类型【中断指针(I)触发】程序设定
- 4. 在扫描类程序建立允许中断指针(I)触发的代码
- 5. 事件触发类型【中断指针(I)触发】程序代码及硬件指针(I)
- ■ 事件触发类型【中断指针(I)触发】程序代码
- ■ 硬件指针(I)设定
- 6. 模拟运行
- (三)经过一定时间之后触发的中断程序
- 1. 创建扫描类程序
- 2. 创建事件触发类的程序文件
- 3. 扫描程序与事件触发类型【经过一定时间之后触发】程序设定
- 4. 在扫描类程序建立允许中断指针(I)触发的代码
- 5. 事件触发类型【经过一定时间之后触发】的程序代码
- 6. 模拟运行
- 三、程序类型切换的代码实现方法
- (一)用代码实现程序类型切换
- 1. 增加待机程序、无执行类型程序
- ■ 初始程序(文章写完后补充)
- ■ 待机程序
- ■ 无执行类型程序
- ■ 文件程序类型汇总
- 2. 从初始处理类、恒定周期类、事件触发类、扫描类型、待机类型程序切换为扫描类型的命令
- 3. 从初始处理类、恒定周期类、事件触发类、扫描类型、待机类型程序切换为待机类型
- 4. 无执行类型程序切换为待机类型或者扫描类型(会报错)
- 5. 模拟运行(第2.3小节知识)
- 6. 模拟运行(第4小节知识)
- Ⅲ、实操之程序跳转、调用
- 一、实操之程序跳转、调用
- (一)程序跳转、调用命令
- (二)子程序的编写
- (三)程序模拟
- 1. 本程序文件的子程序调用演示
- 2. 其他程序文件的子程序调用演示
Ⅰ、理论
一、程序的执行
扫描流程构成
1. 初始处理及RUN时初始化处理
在初始处理及RUN时初始化处理中,进行以下处理。
2. I/O刷新
开始程序运算前执行以下内容。
- 从输入模块/智能功能模块至CPU模块的ON/OFF数据的输入
- 从CPU模块至输出模块/智能功能模块的ON/OFF数据的输出
- 执行恒定扫描时,恒定扫描的等待时间结束之后再进行I/O刷新。
3. 程序的运算
按照程序设置,从各程序的步0开始执行至END/FEND指令为止。该程序称为主程序。此外,可以将主程序分割为子程序等等
4. END处理
在END处理中也会执行中断程序或恒定周期触发类型的程序、事件触发类型的程序(触发类型发生中断时)。不希望在END处理中执行中断程序的情况下,应在END处理之前通过DI指令将其置为中断禁止状态,之后在程序的起始处通过EI指令将其置为中断允许状态。
二、数据通信及输入输出处理
(一)数据通信
在数据通信中,对CPU模块与智能功能模块等的输入输出信号以及缓冲存储器、链接软元件等的数据进行通信。
数据通信中,分为将模块数据通过END处理自动发送接收到CPU模块的软元件及标签中的刷新方式和执行程序指令时进行访问的直接方式。
(二)输入输出处理及响应延迟
CPU模块的输入输出处理是刷新方式。但是,可通过在程序中使用直接访问输入输出
1.刷新方式
*1也有不是在每个END处理时执行,而是在指定的END处理时执行刷新处理的模块
2.直接方式
在执行程序时进行用指令直接访问输入输出模块。
3. 刷新方式和直接方式的对比
(三)刷新方式
在指定的时机对输入输出模块进行批量访问。
输入刷新及输出刷新的时机取决于指定的刷新时机的设置。
1. 详细内容
*1远程输入刷新区是指在CC-Link IE控制网络、CC-Link IE现场网络、CC-Link IE现场网络Basic、MELSECNET/H、CC-Link中对输入(X)中进行了刷新设置情况下的区域。
*2可对工程工具用输入区域进行ON/OFF的操作如下所示。
· 通过工程工具进行的测试操作
· 来自网络模块的写入
· 使用了来自SLMP的外部设备的写入
*3可对输出(Y)用软元件存储器进行ON/OFF的操作如下所示。
· 通过工程工具进行的测试操作
· 来自网络模块的写入
· 使用了来自SLMP的外部设备的写入
2. 响应延迟
对于相对于输入模块变化的输出的变化,根据外部触点ON的时机,将有最长2个扫描的延迟。
梯形图示例:输入X5为ON时输出Y5E为ON的梯形图
(四)直接方式
在CPU模块中,使用直接访问的指令【输入(DX)、输出(DY)】进行直接方式的输入输出处理。
1. 详细内容
*1可对工程工具用输入区域进行ON/OFF的操作如下所示。
· 通过工程工具进行的测试操作
· 来自网络模块的写入
· 使用了来自SLMP的外部设备的写入
*2可对输出(Y)用软元件存储器进行ON/OFF的操作如下所示。
· 通过工程工具进行的测试操作
· 来自网络模块的写入
· 使用了来自SLMP的外部设备的写入
2. 响应延迟
根据外部触点ON的时机,将有最长1个扫描的延迟。
梯形图示例:输入DX5为ON时,输出DY5E为ON的梯形图
三、程序的类型
(一)初始处理类的程序
用于智能功能模块的初始处理之类的,Run的第一个扫描周期只执行一次
(二)扫描类型的程序
执行初始处理类的程序后,每个扫描周期都执行1次的程序。
(三)恒定周期间隔触发类的程序
是在各指定时间执行的中断程序。但是,与通常的中断程序不同,无需记述中断指针(I)及IRET指令,而是以程序文件单位执行。
- 执行恒定周期类型程序时,需要通过EI指令置为中断允许状态
1. 恒定周期间隔的设置
[CPU参数]-[程序设置]
“程序设置”画面
“详细设置”画面
“恒定周期执行类型详细设置”画面
2. 执行条件成立时
■ 通过EI指令置为中断允许状态之前执行条件成立的情况下
程序成为等待状态,在变为中断允许执行状态的时刻执行。此外,在等待的状态中,即使该恒定周期执行类型程序的执行条件多次成立,在变为中断允许状态的时刻也仅执行1次程序。
■ 在链接刷新程序执行中发生了恒定周期执行类的程序中断被触发的情况下
暂停链接刷新的程序,执行恒定周期执行类型的程序。CC-Link IE现场网络等的链接刷新中,即使进行了循环数据的站单位块保证,在恒定周期执行类型程序中使用了设置为刷新目标的软元件的情况下,将无法进行循环数据的站单位块保证。
■ 执行恒定扫描时的END处理后的等待时间中,发生了恒定周期执行类的程序中断被触发的情况下
执行恒定周期执行类型程序。
■ 恒定周期执行类的程序在执行中发生了其他类型程序中断被触发的情况下
恒定周期执行类型的程序执行中发生了中断程序(也包括发生事件执行类型程序的中断时的指定)的情况下,按照中断优先度执行动作
3.恒定周期执行模式
在恒定周期执行类型的程序及通过CPU模块的内部定时器进行的恒定周期中断(I28~I31、I48、I49)中,可以设置有多次触发中断情况下,在中断允许后的程序执行次数。但是,发生通过DI指令等进行的中断禁止设置,执行时,不在恒定周期执行模式的对象范围内。
■ 恒定周期执行模式的动作
- 优先执行次数
,对保证程序的执行次数。
触发次数全部记录后,执行时,执行对应触发次数遍中断程序
- 优先恒定周期性
中断程序存在执行要等待的情况下,将该程序的执行在从扫描周期开始的延迟限制值的范围内执行,但是,即使存在多次中断被触发也仅执行1次
■ 恒定周期执行模式的设置
[CPU参数]-[中断设置]-[恒定周期执行模式设置]
项目 | 内容 | 设置范围 | 默认 |
---|---|---|---|
恒定周期执行模式 | 恒定周期性优先的情况下,将该执行在从周期开始的延迟限制值的范围内执行。执行次数优先的情况下,按执行等待的次数全部执行。 | 优先恒定周期性 / 优先执行次数 | 优先恒定周期性 |
■ 从扫描周期开始的延迟限制值设定
从扫描周期开始的延迟(偏差)的允许值设定如下所示,在该范围内中断使能变为允许状态的情况下,执行等待的程序。否则超出范围了就不在执行中断程序。
从周期开始的延迟限制值根据以下情况而有所不同。
- 恒定周期执行类型的程序的情况下
变为所有恒定周期执行类型程序的恒定周期间隔的最大公约数。例如,存在有周期为2ms、4ms、12ms的恒定周期执行类型程序的情况下,从周期开始的延迟限制值将变为2ms。 - 通过CPU模块的内部定时器进行的恒定周期中断(I28~I31、I48、I49)的情况下
固定为与恒定周期间隔相同的值。例如,如果周期为I28:100ms,I29:20ms,从周期开始的延迟限制值将变为I28:100ms,I29:20ms。
(四)事件触发类的程序
是将指定的事件作为触发的程序
1. 触发类型
■ 通过中断指针(I)触发执行的中断程序
中断指针(I)被触发时,立即执行1次程序。此外,执行之前,需要通过EI指令预先置为中断允许状态。由于可以作为独立中断程序,因此扫描执行类型程序中无需记述通过FEND指令、中断指针及IRET指令分割的程序。
■ 位数据的ON(TRUE)来触发的程序
如设置Y50为ON的情况下执行事件程序。Y50为OFF的情况下不执行程序。
设置为“清除输出及定时器的当前值”的情况下,Y50变为OFF后,下一次事件类型程序执行时,相应程序内使用的输出(Y)及定时器(T)及超长定时器(LT)的当前值将被清除。
- 事件执行类型的程序的触发执行的条件未成立时,定时器及累计定时器也在继续进行计测的情况下,应使用超长定时器(LT)及超长累计定时器(LST)。此外,对于定时器(T)及累计定时器(ST),可以在事件执行类型程序中使用,但事件执行类型程序的触发执行条件未成立时不能进行计测。使用定时器(T)及累计定时器(ST)的情况下,应将“清除输出及定时器的当前值”的设置设置为“清除”。
■ 经过一定时间之后触发的中断程序
将CPU模块置为RUN后,以CPU参数的程序设置中指定的执行顺序执行程序,经过指定时间后,相应的事件执行类型的程序在前一个程序执行完后被执行1次程序。从对应的事件执行类的程序的程序执行开始重新计测时间,经过指定时间后,相应的事件执行类型的程序在前一个程序执行完后被执行1次程序,并重复上述动作。不是中断其他程序的执行立马执行的,而是经过指定时间后定期执行程序的情况下,可以使用此类型的模式。此外,经过指定时间后,变为下一个相应的事件执行类型程序的执行时,相应程序内使用的输出(Y)以及定时器(T)及超长定时器(LT)的当前值将被清除。
(1) 经过指定时间后,变为相应的事件执行类型程序的执行对应的顺序时,将执行事件执行类型程序C。
(2) 设置为“清除输出及定时器的当前值”的情况下,经过指定时间后的下一个事件执行类型程序的执行顺序时,相应程序内使用的输出(Y)以及定时器(T)及超长定时器(LT)的当前值将被清除。
2. 触发设置
[CPU参数]-[程序设置]
“程序设置”画面
“详细设置”画面
“事件执行类型详细设置”画面
(五)待机类程序
将子程序或中断程序设置为待机类型程序,与主程序分开管理,使子程序或中断程序的执行可管理。
1. 通过参数设置进行的方法
[CPU参数]-[程序设置]-[详细设置]
点击程序设置的“详细设置”,随后在各程序的执行类型的“类型”中选择执行类型。
“程序设置”画面
“详细设置”画面
.
2. 通过指令进行更改程序执行的方法
通过以下指令更改。
PSCAN
PSTOP
POFF
■ 注意事项
更改执行类型时的注意事项如下所示。
- 将恒定周期触发类的程序、事件触发类的程序更改为其他执行类型时,将无法恢复为原来的执行类型。
- 在同一个扫描中对同一个程序执行了指令的情况下,将以最后执行的指令执行动作。
(六)程序刷新的组设置
对各程序设置对应组号码.,通过在各模块中指定该组号码.,可以将刷新时机设置为对应指定执行的顺序*1。
*1在程序之前进行输入刷新(输入(X)、模拟输入的获取),在程序执行后进行输出刷新(模拟输出、输出(Y))。
1. 程序刷新的组设置
[CPU参数]-[程序设置]-[程序设置]-[详细设置]
项目 | 内容 | 设置范围 | 默认 |
---|---|---|---|
刷新组号设置 | 设置各模块中指定的各程序的组号。 | 不设置 / (组[1]~[64]) | 不设置 |
2. 各模块的刷新设置
在各模块的刷新设置中选择“指定程序执行时”,输入希望刷新的程序的组号码.。
[模块参数]-[刷新设置]
(例:输入输出模块的“刷新设置”画面)
四、子程序
是从指针§开始至RET指令为止的程序。仅通过子程序调用指令(CALL指令、ECALL指令等)进行调用的情况下才执行。
此外,也可使用指针型的标签替代指针§。子程序有以下用途。
将1个扫描中多次执行的程序作为子程序汇总为1个程序,可以减少整个程序的步数。
将仅在某个条件下才执行的程序设置为子程序,可以缩短相应的扫描时间。
RET是R系列使用,SRET是FX5U使用。
- 注意事项
- 使用子程序时的注意事项如下所示。
- 使用局部软元件的情况下,通过SM776(CALL时局部软元件的允许/禁止设置)的设置,可以使用子程序的存储目标程序文件的局部软元件。
- 请勿使用定时器(T、ST)。但是,必定1个扫描仅执行1次的定时器的线圈(OUT T指令)的情况下可以使用。
- 调用时在未使用RET指令的状况下返回至调用源的程序,结束程序时将变为出错状态。
- FB、FUN内存在指针§或指针型全局标签的情况下,将变为出错状态。
五、指针(P)
是跳转指令(CJ/SCJ/JMP指令)及子程序调用指令(CALL指令等)的软元件,指针的类型有全局指针及局部指针。指针用于以下用途。
指定跳转指令(CJ/SCJ/JMP指令)的跳转目标及标签。
指定子程序调用指令(CALL指令等)的调用目标及标签(子程序起始)。
(一)全局指针
是可从正在执行的所有程序中通过子程序调用指令调用的指针。
1. 全局指针的点数计算
全局指针的点数是“参数中设置的指针点数”-“各程序中使用的局部指针的合计点数”。
注:不能将同一指针编号的全局指针作为标签设置到多个位置。
(二)局部指针
是各程序中单独使用的指针,各程序中可以使用同一指针编号。局部指针以“#”+“指针编号”指定。
(1) 在不同的程序之间,可以使用相同编号的局部指针。
1. 局部指针点数计算
在所有的程序中分开使用。各程序使用的局部指针点数为从P0开始至使用的局部指针的最大编号为止。例如,即使只使用了P99,也将成为使用P0~P99的100点。多个程序中使用局部指针的情况下,通过在各程序组中按从P0开始的顺序使用,可以在使用局部指针时避免浪费。
(三)指针设置
[CPU参数]-[存储器/软元件设置]-[指针设置]
注:指定的指针编号设置应不超过“参数中设置的指针的最终编号”-“全局指针的点数”。
六、中断程序
是从中断指针(I)开始至IRET指令为止的程序。
发生中断触发时,将执行该中断指针编号对应的中断程序。此外,执行之前需要预先通过EI指令置为中断允许状态。
(一)发生中断触发时的响应
1. 链接刷新中发生了中断原因的情况下
中断执行中的链接刷新,执行触发的中断程序。在CC-Link IE现场网络等的链接刷新中,即使进行了循环数据的站单位块保证,在中断程序中使用了设置为刷新目标的软元件的情况下,将无法实施循环数据的站单位块保证。
■ 执行恒定扫描时的END处理后的等待时间中发生了中断触发的情况下
执行该中断触发的中断程序。
■ 中断允许状态中同时发生了多个中断被触发的情况下
将从优先度高的中断程序开始依次执行
2. 中断禁止(DI)中发生了中断触发的情况下
-
I0~I15、I28~I31、I48、I49、I50~I1023的情况下
存储发生的中断信号,在变为中断允许状态的时刻,执行对应于存储的中断信号的中断程序。即使同一中断信号发生了多次,也仅存储1次该中断信号。但是,通过IMASK指令及SIMASK指令指定了中断禁止的情况下,信号将全部被删除。
(1) 不存储中断禁止(DI)中发生的第2次及其以后的中断信号。
(2) 变为中断允许后,从优先度高的I49开始执行。
(3) 执行I28。(不执行第2次I49。) -
I45的情况下
存储发生的中断信号,在变为中断允许状态的时刻执行I45的中断程序。即使发生了多次I45的中断,也仅存储1次该中断信号。但是,通过IMASK指令及SIMASK指令指定了中断禁止的情况下,信号将全部被删除。
Mc:多CPU之间同步周期
(1) 存储。
(2) 不存储中断禁止(DI)中发生的第2次及其以后的中断信号。
(3) 执行中断。
(4) 中断允许中,因此执行中断 -
I44的情况下
在下一个周期之前变为中断允许状态的情况下,在变为中断允许执行状态的时刻执行I44的中断程序。中断禁止状态超过了下一个周期(第2周期)的情况下,存储的中断信号将被删除。(即使变为中断允许状态,也不执行I44的中断程序。)此外,由于本原因而未能执行I44的中断程序的情况下,SM480(模块之间同步中断程序(I44)异常发生标志)变为ON,对SD480(模块之间同步中断程序(I44)异常发生次数)进行递增计数。但是,通过IMASK指令及SIMASK指令指定了中断禁止的情况下,存储的中断信号将全部被删除。
Sc:模块之间同步周期
(1) 存储。
(2) 未插入中断,因此如果是第2个周期,则删除所存储的中断信号。
(3) 变为中断允许执行状态后,执行中断。
(4) 中断禁止(DI)中超过了I44的第2个周期,因此不执行I44。
(5) 中断允许中,因此执行中断。
■ 中断程序执行中发生了优先度较低或优先度相同的中断原因的情况下
-
I0~I15、I50~I1023的情况下
存储发生的中断触发信号,在执行中的中断程序结束后,执行存储的中断信号对应的中断程序。即使同一中断信号发生了多次,也仅存储1次该中断原因
(1) 不存储中断禁止(DI)中发生的第2次及其以后的中断信号。
(2) 执行中的中断结束后,从优先度高的I50开始执行。相比优先度相同的I80,从优先顺序高的I50开始执行。
(3) 执行I80。(不执行第2次I50。)
(4) 执行I100。(不执行第2次I80。) -
I45的情况下
存储发生的中断信号,执行中的中断程序结束后,执行I45的中断程序。即使发生了多次I45的中断,也仅存储1次该中断信号。
Mc:多CPU之间同步周期
(1) 存储。
(2) 不存储中断禁止(DI)中发生的第2次及其以后的中断信号。
(3) 优先度高的I49结束后执行。
(4) 优先度相同,因此在I44结束后执行中断。
(5) I49、I44已结束,因此执行中断。
- I28~I31、I48、I49的情况下
存储发生的中断信号,执行中的中断程序结束后,执行存储的中断信号对应的中断程序。多次发生同一中断信号的情况下,仅存储1次中断信号,第2回次及其以后将按照恒定周期执行模式的设置执行动作。(恒定周期执行模式)“优先执行次数”设置时,执行中的中断程序结束后执行存储的中断信号的中断程序。“优先恒定周期性”设置时,第2次及其以后将不存储。
(1) 中断执行中发生的第2次及其以后的中断信号,将按照恒定周期执行模式的设置执行动作。
(2) 不执行第2次。
(3) 执行中的中断结束后,从优先度高的I29开始执行。
(4) 执行第2次。
(1) 中断执行中发生的第2次及其以后的中断信号,将按照恒定周期执行模式的设置执行动作。
(2) 不执行第2次。
(3) 执行中的中断结束后,从优先度高的I29开始执行。
(4) 执行第2次。
- I44的情况下
在下一个周期之前执行中的中断程序结束的情况下,在中断程序结束的时刻执行I44的中断程序。执行中的中断程序的结束超过了下一个周期(第2个周期)的情况下,存储的中断信号信息将被删除。(即使执行中的中断程序结束,也不执行I44中断程序。)此外,由于本原因而未能执行I44的中断程序的情况下,SM480(模块之间同步中断程序(I44)异常发生标志)变为ON,对SD480(模块之间同步中断程序(I44)异常发生次数)进行递增计数。
Sc:模块之间同步周期
(1) 存储。
(2) 未插入中断,因此如果是第2个周期,则删除所存储的中断信号。
(3) 优先度高的I49结束后执行。
(4) 优先度相同时,则在优先度高的I45结束后,执行中断。
(5) I49或I45的结束超过了I44的第2次周期,因此不执行I44。
(6) I49、I45已结束,因此执行中断。
3. 中断程序执行中发生了同一中断信号的情况下
-
I0~I15、I50~I1023的情况下
存储发生的中断信号,在变为中断允许状态的时刻,执行对应于存储的中断原因的中断程序。即使同一中断信号发生了多次,也仅存储1次该中断信号。
(1) 不存储中断执行中发生的第2次及其以后的中断信号。
(2) 执行中的中断结束后,执行第1次的中断程序。 -
I45的情况下
与执行中的中断程序的相同触发的中断信号不被存储,因此执行中的中断程序结束后不执行中断程序。此外,由于本信号而未能执行I45的中断程序的情况下,SM481(多CPU之间同步中断程序(I45)异常发生标志)变为ON,对SD481(多CPU之间同步中断程序(I45)异常发生次数)进行递增计数。
Mc:多CPU之间同步周期
(1) 同一中断(I45)执行中,因此删除。
(2) 不执行中断。
(3) 执行中断。 -
I28~I31、I48、I49的情况下
存储发生的中断信号,执行中的中断程序结束后,执行存储的中断信号对应的中断程序。多次发生同一中断信号的情况下,仅存储1次中断信号,第2次及其以后将按照恒定周期执行模式的设置执行动作。(恒定周期执行模式)“优先执行次数”设置时,执行中的中断程序结束后执行存储的中断原因的中断程序。“优先恒定周期性”设置时,第2次及其以后将不存储。
(1) 中断执行中发生的第2次及其以后的中断信号,将按照恒定周期执行模式的设置执行动作。
(2) 不执行第2次。
(3) 执行第2次。 -
I44的情况下
与执行中的中断程序相同的中断信号不被存储,因此执行中的中断程序结束后不执行中断程序。此外,由于本信号而未能执行I44的中断程序的情况下,SM480(模块之间同步中断程序(I44)异常发生标志)变为ON,对SD480(模块之间同步中断程序(I44)异常发生次数)进行递增计数。
Sc:模块之间同步周期
(1) 同一中断(I44)执行中,因此删除。
(2) 不执行中断。
(3) 执行中断。
4. STOP/PAUSE状态下发生了中断原因的情况下
-
I0~I15、I28~I31、I48、I49、I50~I1023的情况下
存储发生的中断信号,CPU模块进入RUN状态,在变为中断允许状态的时刻执行中断程序。进入RUN状态之前即使多次发生同一中断信号,该中断原因也仅被存储1次。
(1) 不存储STOP中发生的第2次及其以后的中断信号。
(2) STOP→RUN的中断允许时,从优先度高的I50开始执行。
(3) 执行I100。(不执行第2次I50。) -
I45的情况下
不存储发生的中断信号,因此即使CPU模块进入RUN状态,变为中断允许状态,也不执行中断程序。CPU模块进入RUN状态,在RUN后第1次中断中执行中断程序。
Mc:多CPU之间同步周期
(1) 不执行中断。
(2) 执行中断。 -
I44的情况下
不存储发生的中断信号,因此即使CPU模块进入RUN状态,变为中断允许执行状态,也不执行中断程序。CPU模块进入RUN状态,在变为中断允许执行状态的时刻进行中断启动准备(在第1次的中断中不执行中断程序),在进入RUN后的第2次周期中执行中断程序。
Sc:模块之间同步周期
(1) 不执行中断。
(2) 执行中断。
(二)设置中断周期
[CPU参数]-[中断设置]-[恒定周期间隔设置]
(三)指令执行中的中断允许
[CPU参数]-[中断设置]-[指令执行中的中断允许设置]
(四)中断程序启动时的处理
1. 文件寄存器®块No.的保存/恢复
中断程序启动时,保存执行中的程序中的文件寄存器®的块号,将该块号传递到中断程序中。此外,中断程序结束时,将保存的块号恢复到执行中的程序中。
[CPU参数]-[中断设置]-[块号保存/回归设置]
- 在中断程序中不更改文件寄存器®的块号的情况下,通过设置为“不保存/不回归”,可以加快中断程序的启动时间及结束时间。设置为“不保存/不回归”时,通过中断程序更改文件寄存器®的块号的情况下,应对相应文件寄存器®的块号通过程序进行保存/恢复。
2. 变址寄存器(Z、LZ)的保存/恢复
中断程序启动时,对执行中程序中的变址寄存器(Z、LZ)的值进行保存,中断程序结束时,将保存的值恢复到执行中程序中。此外,启动中断程序时,局部变址寄存器(Z、LZ)将不进行切换并动作。因此,中断程序/恒定周期执行类型的程序/以中断发生为触发的事件执行类型的程序中使用了局部变址寄存器(Z、LZ)的情况下,将使用中断程序/恒定周期执行类型的程序/以中断发生为触发的事件执行类型的程序执行之前已执行的局部变址寄存器(Z、LZ),因此不能作为独立的局部变址寄存器(Z、LZ)使用。
即有之前保存,用完之后再把寄存器的值恢复回主扫描程序
(五)多重中断功能
执行中断程序时发生了其他的中断信号触发的情况下,根据设置的优先度,暂停优先度较低的程序的执行,执行其执行条件成立的优先度较高的程序。
1. 中断优先度
对于下述中断优先度1~4不能对其优先度进行更改。对于中断优先度5~8可以对其优先度进行更改
2. 中断优先度设置
对于来自于模块的中断优先度(5~8)可以进行更改。
[CPU参数]-[中断设置]-[模块的中断优先度设置]
“中断设置”画面
“详细设置”画面
3. 指定的优先度及其以下的中断禁止/允许
即使正在进行多重中断,也可通过DI指令/EI指令对指定的优先度及其以下的中断进行禁止或者允许。
- 中断信号优先等级表
- 对于处于中断禁止的优先度以及当前的中断优先度,可以通过SD757(当前的中断优先度)、SD758(中断禁止优先度设置值)进行确认。
4. 多重中断的执行顺序
发生了多个中断信号的情况下,执行优先度最高的中断程序。在多重中断的程序结束的时刻,在暂停中的程序及发生中断后处于等待状态的中断程序中,执行优先度最高的中断程序。
(1) 中断允许
(2) 中断优先度较高的I50将被执行。
(3) 中断优先度较低,因此变为等待状态。
(4) 中断优先度较高的I101将被执行。
(5) 复位。暂停中的I50的执行将重启。
(6) 根据设置,与I50的中断优先度相同,因此在I50的执行完成之前都处于等待状态。
(7) 中断指针编号较小的I0将比I100优先执行。
(8) 复位。中断优先度高于I1020及I0的I1020将被执行。
(9) 复位。中断优先度高于I2的I1020将被执行。
(10) 复位。暂停中的I2的执行将重启。
(六)注意事项
1. 创建程序时的限制
- 对于PLS/PLF指令,在执行指令后的下一个扫描中会进行OFF处理。变为ON的软元件,在再次中断程序动作、指令执行之前将保持为ON不变。
- 定时器(T、ST)、计数器©在中断程序中不能使用。
2. 关于使用FB/FUN时的中断处理
-
FB/FUN由多个指令构成。因此,即使将CPU参数的“指令执行中的中断允许设置”设置为“禁止”,如果在执行FB/FUN中发生中断,也会中断FB/FUN的执行,并执行中断信号对应的程序。
希望在FB/FUN执行中禁止执行中断程序时,应在FB/FUN调用前通过DI指令来禁止中断,执行后通过EI指令设置为中断允许。 -
ST或FBD/LD的程序中,以下要素与部件均由多个指令构成。
各指令(生产厂商定义FB/FUN)
ST的算数运算公式(D0:= D1 + D2 - D3;等)
ST的逻辑运算公式(M0:= M1 AND M2 OR M3;等)
希望在执行途中禁止中断时,与“指令执行中的中断允许设置”的设置无关,应在各要素与部件的前后使用DI指令、EI指令。
七、程序执行流程
程序在CPU模块变为RUN状态时,将按照程序的执行类型及执行顺序的设置,依次执行
程序的执行类型相同的情况下,按照执行顺序设置的编号顺序执行。
八、本文理论引用
- MELSEC iQ-R CPU模块用户手册(应用篇)[SH-081316CHN] 的章节 “1 CPU模块的动作—1 程序的执行”、“3 软元件/标签及常数—22.12 指针(P)”
- MELSEC iQ-R 编程手册(CPU模块用指令/通用FUN/通用FB篇)[SH-081322CHN] 的章节 “5 应用指令—7 程序控制”、“5 应用指令—7.4 程序控制用指令”
Ⅱ、实操之(中断)程序触发
恒定周期间隔触发类型的程序和事件触发类的程序都是受特定条件触发的程序是恒定周期间隔触发类型只需要一个恒定周期程序文件,在程序类型里设定时间就可以,基本上也可以算是一个“事件触发类”的程序(对应的执行优先级也为4),但事件触发类型【经过一定时间之后触发】的程序也同时触发时,会优先执行事件触发类型【经过一定时间之后触发】的程序,如下所示,同时触发时的执行顺序是I31→I30→I29→I28→恒定周期执行类型程序
一、创建恒定周期间隔触发类型的程序
(一)创建恒定周期间隔触发类型的程序
1. 创建扫描类程序
新建工程时就会要求创建,略
2. 创建恒定周期间隔触发类的程序文件
3. 扫描程序与恒定周期触发程序类型设定
4. 在扫描类程序建立允许恒定周期中断触发代码
5. 恒定周期间隔触发的程序代码
使用一个寄存器D记录被执行次数
6. 模拟运行
M0=1,允许恒定周期中断触发后,每5秒周期会自动执行一次恒定周期程序代码
二、创建事件触发类的程序
(一)位数据的ON(TRUE)触发的中断程序
1. 创建扫描类程序
新建工程时就会要求创建,略
2. 创建事件触发类的程序文件
3. 扫描程序与事件触发类型【位数据的ON(TRUE)来触发】程序设定
4. 在扫描类程序建立允许位数据的ON(TRUE)中断触发的代码
5. 事件触发类型【位数据的ON(TRUE)来触发】程序代码
6. 模拟运行
M0=1,允许事件触发类型【位数据的ON(TRUE)】被触发后,每2秒会自动执行一次事件触发类型【位数据的ON(TRUE)】程序代码
(二)中断指针(I)触发执行的中断程序
中断指针(I)触发执行的中断程序可用下面这种方式直接放在扫描程序文件里,通过中断指针(I)就可以触发执行
1. 创建扫描类程序
新建工程时就会要求创建,略
2. 创建事件触发类的程序文件
3. 扫描程序与事件触发类型【中断指针(I)触发】程序设定
填入的I+数字可指定的中断指针(I)为I0~I15、I28~I31、I44、I45、I48、I49、I50~I1023。
4. 在扫描类程序建立允许中断指针(I)触发的代码
5. 事件触发类型【中断指针(I)触发】程序代码及硬件指针(I)
■ 事件触发类型【中断指针(I)触发】程序代码
■ 硬件指针(I)设定
填入的I+数字可指定的中断指针(I)为I0~I15、I28~I31、I44、I45、I48、I49、I50~I1023。
6. 模拟运行
M0=1,允许事件触发类型【中断指针(I)触发】被触发后,X0上升沿自动执行一次事件触发类型【中断指针(I)触发】程序代码,但没实物,故无法使指针 I0=true。
(三)经过一定时间之后触发的中断程序
1. 创建扫描类程序
新建工程时就会要求创建,略
2. 创建事件触发类的程序文件
3. 扫描程序与事件触发类型【经过一定时间之后触发】程序设定
4. 在扫描类程序建立允许中断指针(I)触发的代码
5. 事件触发类型【经过一定时间之后触发】的程序代码
6. 模拟运行
M0=1,允许事件触发类型【经过一定时间之后触发】被触发后,每2秒会自动执行一次事件触发类型【经过一定时间之后触发】程序代码
三、程序类型切换的代码实现方法
只能【从初始处理类、恒定周期类、事件触发类、扫描类型、待机类型程序切换为扫描类型】 或 【从初始处理类、恒定周期类、事件触发类、扫描类型、待机类型程序切换为待机类型】,不能【从待机类型或扫描类型切换为恒定周期类、事件触发类、初始处理类】,如果恒定周期类、事件触发类、初始处理类型程序用指令被切换为待机或扫描类型后, 想从重新改回原文件设定的程序类型只能重新下载。
无执行类型程序也不能切换为待机类型或者扫描类型
(一)用代码实现程序类型切换
1. 增加待机程序、无执行类型程序
在以上第一章和第二章的基础上增加待机程序MAIN5和无执行类型的程序MAIN6
■ 初始程序(文章写完后补充)
(这里补充初始程序的增加方法)
■ 待机程序
■ 无执行类型程序
■ 文件程序类型汇总
箭头为文件名字,在转换指令处要使用
2. 从初始处理类、恒定周期类、事件触发类、扫描类型、待机类型程序切换为扫描类型的命令
- PSCAN(P):执行程序扫描登录
在扫描程序MAIN中增加如下代码
3. 从初始处理类、恒定周期类、事件触发类、扫描类型、待机类型程序切换为待机类型
- PSTOP(P):程序待机
- POFF(P):程序输出OFF待机
在扫描程序MAIN中增加如下代码
4. 无执行类型程序切换为待机类型或者扫描类型(会报错)
5. 模拟运行(第2.3小节知识)
在扫描程序中只是激活中断功能使能时,其对应类型还是恒定周期触发/事件触发类型,寄存器的值还是秒为单位在自增,
一旦切换为扫描类型后,数据不再以秒为单位自增
将其使用【PSTOP(P):程序待机】/【 POFF(P):程序输出OFF待机】指令切换为待机类型后,对应的程序变成即使中断使能状态依然是ON状态也不再接受中断信号调用,寄存器值不会自增,如果想改回恒定周期触发/事件触发类型,只能重新下载程序。
6. 模拟运行(第4小节知识)
一旦进行指令切换,CPU将进行报错
Ⅲ、实操之程序跳转、调用
一、实操之程序跳转、调用
(一)程序跳转、调用命令
CALL(P):执行指定的指针的子程序。
FCALL(P):指定的指针的子程序的进行非执行处理。
ECALL(P):程序文件之间子程序调用,执行指定程序文件名的指定指针的子程序。
EFCALL(P):程序文件之间子程序输出OFF调用,指定程序文件名的指定指针的子程序的进行非执行处理
XCALL:进行子程序的执行及非执行处理。条件成立时进行子程序CALL,条件由ON→OFF时进行子程序的FCALL。
(二)子程序的编写
(三)程序模拟
1. 本程序文件的子程序调用演示
本程序文件的子程序被调用次数D12会随M2000的ON./OFF而自增与不自增
2. 其他程序文件的子程序调用演示
根据ECALL(P)指令定义
最终M2100的状态会传到程序文件为MAIN1的FX0,D2100的4个字传到程序文件为MAIN1的FD1,
程序文件为MAIN1运算完的FD2的4个字传到D2000