三菱plc编程口诀ST编程中当CASE选择流程中使用了变量定时器后怎么清除定时数据?

本次KCon 2021黑客大会中也有关于容器逃逸的议题,详情请查看:

容器安全是一个庞大且牵涉极广的话题,而容器的安全隔离往往是一套纵深防御的体系,牵扯到AppArmor、Namespace、Capabilities、Cgroup、Seccomp等多项内核技术和特性,但安全却是一处薄弱则全盘皆输的局面,一个新的内核特性可能就会让看似无懈可击的防线存在突破口。随着云原生技术的快速发展,越来越多的容器运行时组件在新版本中会默认配置AppArmor策略,原本我们在《红蓝对抗中的云原生漏洞挖掘及利用实录》介绍的多种容器逃逸手法会逐渐失效;因此我们希望能碰撞出一些攻击手法,进而突破新版本容器环境的安全能力,并使用更契合容器集群的新方式把“任意文件写”转化为“远程代码执行”,从而提前布防新战场。

结合腾讯蓝军近几年在云原生安全上的积累以及我们在WHC2021上分享的关于《多租户容器集群权限提升的攻防对抗》的议题,本文将着重探讨内核特性eBPF对容器安全性的挑战和云原生攻防场景下的实践。

使用eBPF的容器逃逸技术

centos 都是用的这个实现,当然不同发行版也会有一些定制修改,这个在稍后分析中会简单提及。

vixie-cron 的整体逻辑比较简单,它有一个主循环,每次等待一段时间后都会执行任务并加载 cron 的一些配置文件,加载相关的配置文件的关键函数 load_database

不同的 cron 实现对漏洞利用的影响主要在于: 1、配置文件的路径不一致,2、配置文件的格式不一致,3、检查配置文件更新或监控新配置文件的逻辑有不一致的实现,这些都会影响黑盒或部分白盒场景的漏洞利用的稳定性。

我们把 Linux cron 计划任务能执行命令的文件简单分为了四类:

当然,如果是恶意程序,可能会简单粗暴的把所有路径都写一遍;但是如果是授权的红蓝对抗,如果考虑对抗和业务稳定,暴力利用显然是不现实的;更加值得注意的是,大部分情况我们挖掘到的任意文件写在利用时存在局限,例如无法对文件进行内容上的追加、无法设置文件的可执行权限、无法覆盖现有文件等等。

也有即使你暴力写入了所有配置文件, cron却没有进入加载新配置流程的情况,那就要从源码上看一下 cron 对监控新任务的实现,也就是下文我们要说到的 st_mtime。

在我们代码审计的所有 Cron 实现中,无一例外,察觉到文件更新的方式都是对比配置文件路径的 st_mtime。在操作系统层面,文件夹内任何文件编辑、新增、删除、修改等操作,操作系统都会更新 st_mtime。如图:

但是如上文所述中,利用 eBPF 的手法却不会促使操作系统自动更新目录的 st_mtime,所以我们需要编写 eBPF 代码 attach stat 的 syscall,促使 Cron 进程误以为 crontab 更新了,进而执行我们新创建的计划任务。而有更多场景无法做到伪造或更新 st_mtime,例如使用 debugfs命令 进行任意文件写利用的场景,这是一个极其危险又充满变数的利用方式,但在容器场景中却不少见,可以参考 rewrite-cgroup-devices[4] 场景和 lxcfs-rw[5] 场景。

诚然, Cron 实践中还有每个小时(60分钟)不检查 st_mtime 强制更新新任务的实现(代码如下图),但包含这个设计的实现目前运用比较广泛的仅有 busybox-cron,会使EXP变得小众且不通用;如果你发现原本已经放弃的命令执行利用,吃个饭后Shell居然过来了,可能就是这个原因。

另外一个不依赖于 st_mtime 更新且最快只有每个小时执行一次的文件是上面提到的第四类文件,目录 /etc/cron.hourly/。因为这类文件使用 run-part 触发,任务已经写入了 cron 之中,run-part 会执行目录下的所有可执行脚本,没有 st_mtime 限制;但这类文件在写入时必须赋予可执行权限,不然 run-part 不会执行漏洞利用写入的脚本。

那有没有云原生时代下更为通用且更加兼容的利用方法使我们的EXP更加“云原生”呢?

利用 Static Pod 是我们在容器逃逸和远程代码执行场景找到的解决方案,他是 Kubernetes 里的一种特殊的 Pod,由节点上 kubelet 进行管理。在漏洞利用上有以下几点明显的优势:

另外,Cron 的分钟级任务也会遇到重复多次执行的问题,增加多余的动作更容易触发 IDS 和 IPS,而 Static Pod 若执行成功就不再调用,保持执行状态,仅在程序奔溃或关闭时可自动重启

灵活的进程参数和POD配置使得 Static Pod 有更多方法对抗 IDS 和 IPS,因此也延生了很多新的对抗手法,这里就不再做过多介绍。

5、 检测新文件或文件变化的逻辑更通用

最重要的是,Static Pod 不依赖于 st_mtime 逻辑,也无需设置可执行权限,新文件检测逻辑更加通用。

而文件更新检测是基于 kubelet 维护的 POD Hash 表进行的,配置的更新可以很及时和确切的对 POD 容器进行重建。Static Pod 甚至包含稳定完善的奔溃重启机制,由 kubelet 维护,属于 kubelet 的默认行为无需新加配置。操作系统层的痕迹清理只需删除 Static Pod YAML 文件即可,kubelet 会自动移除关闭运行的恶意容器。同时,对于不了解

bpf_get_current_pid_tgid 获取的是内核调度线程用的pid,而kubelet是多线程程序,因此需要修改根据pid过滤系统调用为使用tgid来过滤,这里采取简单办法,直接根据程序名过滤:

本节展示的示例仅仅是一个PoC,想获取在实战环境下更完善的exploit我们还会需要以下改进:

  • 上述示例的前提条件为知道对应yaml路径,因此在实战环境下,想写出更稳定的exploit需要先hook对应系统调用,得到 kubelet 相应的Static Pod配置文件路径
  • PoC的利用方式是覆盖原有的yaml文件内容,这会导致原来的Pod被删除,更可靠的方式是能实现添加Pod配置的方式,不过由于 kubelet 使用的是 filepath.Glob ,不符合pattern的文件路径都会被过滤,不能简单hook getdent64 系统调用来利用

主动防御可以监控系统 bpf 调用和加载eBPF程序、map的情况,在容器内一般不会加载eBPF程序,如果成功加载,则可能存在eBPF被滥用的情况。

感谢腾讯蓝军 lake、小五、振宇等师傅们在成文先后的审核和帮助,是让他们赋予这篇文章更多的光彩。也感谢你读到这里,成文仓促,希望业界大师傅们多指教勘误。


本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:

}

对于这个问题,开源君整理了68 常见的 Go 语言开源面试题,希望对你有帮助,知识点涵盖的也比较全,从基础到实战都有。

1、说说go语言的main函数

(1)、main函数不能带参数。

(2)、main函数不能定义返回值。

(3)、main函数所在的包必须为main包。

(4)、main函数中可以使用flag包来获取和解析命令行参数。

2、在go语言中,new和make的区别?

3、说说go语言中的switch语句?

单个case中,可以出现多个结果选项。

只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case

4、说说go语言中的for循环?

for循环支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环。

for循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量 。

5、go语言中指针运算有哪些?

(1)、可以通过“&”取指针的地址。

(2)、可以通过“*”取指针指向的数据。

6、说说go语言中的协程?

7、go语言中的引用类型包含哪些?

8、说说go语言中的init函数? (1)、一个包中,可以包含多个init函数

9、 说说go语言的同步锁?

14、协程,线程,进程的区别?

15、 Golang的内存模型,为什么小对象多了会造成gc压力?

16、并发编程概念是什么?

17、读写锁或者互斥锁读的时候能写吗?

18、Log包线程安全吗?

19、主协程如何等其余协程完再操作?

21、map如何顺序读取

23、map不初始化使用会怎么样

24、map不初始化长度和初始化长度的区别

25、map承载多大,大了怎么办

27、字符串不能改,那转成数组能改吗,怎么改

28、怎么判断一个数组是否已经排序

29、普通map如何不用锁解决协程安全问题

32、零切片、空切片、nil切片是什么

33、slice深拷贝和浅拷贝

34、map触发扩容的时机,满足什么条件时扩容?

35、map扩容策略是什么

36、自定义类型切片转字节切片和字节切片转回自动以类型切片

39、线程安全的map怎么实现

40、昨天那个在for循环里append元素的同事,今天还在么?

41、for select时,如果通道已经关闭会怎么样?如果只有一个case呢?

42、golang面试题:怎么避免内存逃逸?

43、golang面试题:简单聊聊内存逃逸?

48、golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?

49、golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?

53、golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出私有变量的 tag?

54、协程和线程的差别

55、垃圾回收的过程是怎么样的?

56、什么是写屏障、混合写屏障,如何实现?

58、动图图解,GMP里为什么要有P

59、协程之间是怎么调度的

61、利用golang特性,设计一个QPS为500的服务器

62、为什么gc会让程序变慢

63、开多个线程和开多个协程会有什么区别

65、必须要手动对齐内存的情况

66、go栈扩容和栈缩容,连续栈的缺点

68、golang隐藏技能:怎么访问私有成员

笔记:提取码:7il3

开源君,专注分享 GitHub、码云优质开源项目,目前分享了诸多的开源项目,帮助了不少的朋友提升了技术与工作效率

如果觉得有用的话,别忘记给我

一个点赞,一个关注,鼓励一下。

}

1131国际标准的第三部分,是第一个为工业自动化控制系统的软件设计提供标准化编程语言的国际标准。该标准得到了世界范围的的众多厂商的支持,但又独立于任何一家公司。该国际标准的制定,是IEC工作组在合理地吸收、借鉴世界范围的各可编程序控制器(PLCs)厂家的技术、编程语言、方言等的基础之上,形成的一套新的国际编程语言标准。1131-3国际标准随着可编程序控制器(PLCs)技术、编程语言等的不断进步也在不断地进行着补充和完善。

  1131-3国际标准得到了包括有美国AB公司、德国西门子公司等世界知名大公司在内的众多厂家的共同推动和支持,它极大地改进了工业控制系统的编程软件质量及提高了软件开发效率;它定义的一系列图形化语言和文本语言,不仅对系统集成商和系统工程师的编程带来很大的方便,而且对最终用户同样会带来很大的方便;它在技术上的实现是高水平的,有足够的发展空间和变动余地,使得能很好地适应于下一个世纪。IEC 1131-3标准最初主要用于可编程序控制器(PLCs)的编程系统,但它目前同样也适用于过程控制领域、分散型控制系统、基于控制系统的软逻辑、SCADA等。1131-3国际标准正在受到越来越多的国外公司、厂商的重视和采用,1131-3国际标准因其具有的诸多优点,也正在受到越来越多的国内公司、厂商的重视和采用。

1131-5是IEC 1131的通信部分,通过IEC 1131-5,可实现可编程序控制器与其它工业控制系统,如机器人,数控系统,现场总线等的通信。

  一、采用IEC 1131-3国际标准的必要性

  1. 对系统“开放性”的要求

  成熟的工业控制市场已经开始对“开放性系统”产品提出了越来越多的要求,IEC

  1131-3国际标准正是适应了这种要求。

  2. 传统PLC梯形图编程的缺点

  l 不同PLC产品的梯形图符号和编程变化很大。

  l 有限的数据封装能力,很难将一个复杂的程序分解为数个简单的程序部分:现在的梯形图编程,一个程序块的内部数据还缺乏对外部隐藏其数据的封装能力,因而,一个大的程序要想分解为几个简单的小程序,并且各个小程序之间具有的清晰的接口是很困难的。

  l 有限的程序可重用性:程序可重用性是现在编程的一个发展趋势,传统的PLC不能通过重复调用相同的逻辑策略和算法,实现程序重复使用。

  l 不支持数据结构:在许多复杂的应用中,程序需要把一些数据组织成象高级语言PASCAL 、C中的数据结构那样的数据类型,而目前的梯形图程序还不支持数据结构。

  l 支持有限的对顺序操作功能编程:传统的PLC梯形图编程对顺序操作的处理方法是,为每一个顺序状态提供一个状态位,这种对顺序操作的处理能力是很有限的。

  l 程序执行的局限性:PLC程序是顺序执行的,执行一次程序的时间取决于程序的长短和复杂性,对很大和很复杂的程序,执行一次程序的时间就较长,这对有些对时间有苛刻要求的应用,是有很大的局限性的。

  l 执行算术操作的局限性:传统的PLC梯形图程序对算术操作处理是很困难的。

  因采用一致的IEC 1131-3国际标准编程,各个PLC厂家的编程系统都是统一的,因而,对用户来说具有如下优点:

  l 减少了人力资源,如培训、调试、维护和咨询的浪费

  l 高水平软件再使用性,它聚焦于解决控制中的问题

  l 减少了编程中的误解和错误

  l 适用于宽环境范围的编程技术:通用的工业控制

  l 连接来自不同程序、项目、公司、地区或国家的部件

  IEC 1131-3软件:一种先进的工业控制编程系统 .

  IEC 1131-3是第一个为工业控制系统提供标准化编程语言的国际标准,该标准针对工业控制系统所阐述的的软件设计概念、模型等适应了当今世界软件、工业控制系统的发展方向,是一种非常先进的设计技术,它不但极大地推动了工业控制系统的软件设计的进步,而且它的许多概念还对现场总线设备的软件设计产生了很大影响。符合IEC 1131-3的软件系统是一个结构完美、可重复使用、可维护的工业控制系统软件,不但能被应用在PLC(可编程控制器),而且还能被应用在控制工业及制造过程的一切软件中,是一种先进的工业控制编程系统。 IEC 1131-3标准包括两部分:编程和公共元素。编程部分描述了两个重要模型:IEC 软件模型和通讯模型。公共元素定义了编程系统中需要的的数据类型。

   一、 IEC 1131-3的两个重要模型 IEC 1131-3标准有两个模型:IEC 软件模型和通讯模型。这两个模型构成了实现符合IEC 1131-3国际标准的编程系统的概念基础,它们不但是IEC 1131-3编程系统区别于传统的PLC编程系统的重要标志,而且也是IEC 1131-3编程系统优越于传统的PLC编程系统的原因所在。IEC 软件模型从理论上描述了如何将一个复杂的程序分解为若干个小的不同的可管理部分,并且在各个被分解部分之间有清晰的和规范的接口的方法;描述了一台PLC如何实现多个独立程序的同时装载、运行;描述了系统如何实现对程序执行的完全控制等。通讯模型同样从理论上描述了不同程序组织单元(POU – Program Organization Units)之间如何交换信息的方法。程序组织单元包括程序,功能块和功能。为了更好地描述IEC 软件模型,我们先通过一个实际的应用系统来描述IEC 1131-3软件与实际系统的关系,然后再进一步说明1131-3软件模型。

二、IEC 1131-3软件与实际系统的关系如图1为一采用PLC的直接数字控制系统。来自物理传感器的连续信号被转换为数字采样信号后,PLC控制系统就可以运行诸如比例,积分,微分(PID)等算法产生控制信号输出,最终实现对装置位置的控制。在图1中,IEC 1131-3软件假设,来自传感器或变送器 图一应用PLC系统的直接数字控制系统的外部数值被直接放在一段特定的内存区,同时,程序运行后产生的结果也被放在一段特定的内存区,更新这些内存区数值,即实现了对执行器或显示器的驱动。到PLC的I/O装置的内存映射并没有定义在标准中,它会随着不同的PLC厂商有很大的不同。三、IEC 软件模型 IEC 1131-3软件模型如图二所示。该软件模型是一种分层结构,每一层隐藏了其下层的许多特征。IEC 1131-3具有的这种分层结构,构成了IEC 1131-3软件优越于传统的PLC软件的理论基础,是IEC 1131-3软件先进性的体现。下面我们先描述软件模型的各个部分的概念,同时分析、总结IEC 1131-3编程系统所具有的优点。

配置、资源、程序和任务在模型的最上层是软件“配置”,它等同于一个PLC软件,使用在一个具体应用的定义PLC行为的整个软件中,它与配置系统的实际过程是不同的。如在一个复杂的由多台PLC组成的自动化生产线中,每台PLC中的软件就是一个独立的“配置”。一个“配置”可与其它的IEC“配置”通过定义的接口进行通讯。在每一个配置中,有一个或多个“资源”,“资源”不仅为运行程序提供了一个支持系统,而且它反映了PLC的物理结构,在程序和PLC物理I/O通道之间提供了一个接口。一个IEC程序只有在装入“资源”后才能执行。“资源”通常放在PLC内,但也可以放在其它系统内。一个IEC程序可以用不同的IEC编程语言来编写。典型的IEC程序由许多互连的功能块组成,各功能块之间可互相交换数据。一个程序可以读写I/O变量,并且能够与其它的程序通讯。一个程序中的不同部分的执行通过“任务”来控制。 “任务”被配置以后,可以控制一系列程序和/或功能块周期性地执行程序或由一个的特定的事件触发开始执行程序。IEC程序或功能块通常保持完全的待用状态,只有当是由一个特定的被配置的任务来周期性地执行或由一个特定的变量状态改变来触发执行的情况,IEC程序或功能块才会执行。

   2. 功能块和功能功能块概念是IEC 1131-3标准编程系统的一个重要的特征。任何功能块可以用其它的更小的更易管理的功能块来编程,这样就可以由许多的功能块创建一个有层次的结构合理的程序。IEC 1131-3还允许程序设计人员利用现有的功能块和其它的软件元件生成新的功能块。 图二:IEC软件模型功能也是IEC 1131-3标准中的一个重要概念,但在软件模型中未表现出来,它常常使人们与功能块混淆。功能是一些在程序执行过程中的软件元件,这些软件元件对一系列特定的输入值会产生相应的输出结果,如算术功能COS(),SIN()等。IEC 1131-3标准中有大量的用于处理不同数据类型的功能。

3.变量和存取路径在配置、系统资源、程序、功能或功能块内,可以声明和使用局部变量、全局变量、直接变量。局部变量是仅仅能在配置、资源、程序、功能或功能块内声明和存取的变量;全局变量在一个程序(或配置)内声明,它能被程序(配置)内的所有软件元件存取;直接变量是PLC程序的内存区直接用地址变量来表示的变量。存取路径提供了在不同的配置之间交换数据和信息的设备。每一配置内的变量可被其它远程配置存取。配置之间存取数据和信息可采用基于以太网的网络,现场总线或通过底板总线交换数据。

  4、软件模型到实际系统的映射 IEC 软件模型到实际系统的映射,针对不同的系统有如下的不同的映射关系: 1.具有一个主处理器的小型系统:小型系统的模型典型地退化为一个配置、一个资源和一条程序。 2.具有多处理器的较复杂系统:整个PLC被看作一个配置,每个处理器用一个资源描述,一个资源支持一条或多条程序。 3. 对于分散PLC 系统:分散PLC 系统将包含多个配置,一个配置对应多个处理器,每个处理器用一个资源描述,一个资源支持一条或多条程序。 IEC 软件模型可以充分地适应于从简单到较复杂PLC系统,甚至是非常复杂的PLC系统,这就大大地扩展了传统PLC的应用范围和领域。

  五、 IEC 软件模型的优点 IEC 软件模型具有如下优点: 1.在一台PLC中同时装载、启动和执行多个独立的程序:IEC 1131-3标准允许一个“配置”内有多个“资源”,每个“资源”能够支持多个程序,这使得在一台PLC中可以同时装载、启动和执行多个独立的程序,而传统的PLC程序只能同时运行一个程序。 2.实现对程序执行的完全控制能力:IEC1131-3标准的这种“任务”机制,保证了PLC系统对程序执行的完全控制能力。传统PLC程序只能顺序扫描、执行程序,对某一段程序不能按用户的实际要求定时执行,而IEC 1131-3 程序允许程序的不同部分在不同的时间、以不同的比率并行执行,这大大地扩大了PLC的应用范围。 3.IEC软件模型能够适应很广范围的不同的PLC结构:IEC软件模型是一个国际标准的软件模型,它不是针对具体的PLC系统,而是具有很强的适用性。 4. IEC软件模型既能适合小型的PLC系统,也可适合较大的分散系统。 5. IEC软件支持程序组织单元的重用特性:软件的重用性是IEC软件的重要优点。 6. IEC软件支持分层设计:一个复杂的IEC软件通常可以通过一层层的分解,最终分解为可管理的程序单元。

  六、通讯模型根据不同的通讯要求,IEC 1131标准规定了以下四种通讯模型: 1.内部通讯:在程序、功能块和功能内部之间可以互相连接以形成一个网络,数据信息可以通过这个内部的网络进行通讯。 2.局变量通讯:全局变量可以被用来在功能块与其它的程序组织单元之间交换数据信息。 3. 外部变量通讯:IEC 1131的第五部分定义了一个通讯功能块家族来通过一个网络来交换数据。 4.使用存取路径通讯:存取变量提供了一种方法用于从远程设备存取特定的变量。丁一在IEC 1131的第五部分的通讯功能块还能读写远程配置中的ACCESS变量。 IEC 1131标准规定的这四种通讯模型,使得不但在IEC编程系统内部的通讯灵活、便捷,而且还有效地支持了IEC编程系统的功能扩展对通讯提出的要求,使得新一代编程系统可以更有效地适应未来对网络、现场总线、远程通讯等新技术发展的要求。七、公共元素公共元素描述了IEC 1131-3五种编程语言、IEC 软件模型及通讯模型中需用到的全部公共编程元素的变量和数据类型,给出了如何命名这些软件元素、声明变量、变量及数据类型的初始化等规则,是实现IEC 1131-3编程系统不可缺少的有机组成部分。八、结论 IEC 1131-3软件是一个功能强大、设计思想和技术先进并能很好地适应未来发展的编程系统。

Chart)。文本化编程语言包括:指令表(IL-Instruction List)和结构化文本 (ST-Strutured Text)。IEC 1131-3的编程语言是IEC工作组对世界范围的PLC厂家的编程语言合理地吸收、借鉴的基础上形成的一套针对工业控制系统的国际编程语言标准,它不但适用于PLC系统,而且还适用于更广泛的工业控制领域;IEC 1131-3 的编程工具提供对现场总线系统的支持,并对现场总线装置的软件设计产生了很大影响。本专题将分两部分介绍IEC 1131-3的编程语言,本文是IEC 1131-3编程语言的第一部分,重点介绍IEC 1131-3的两种文本化编程语言;第二部分重点介绍IEC 1131-3的两种三种图形化编程语言,将在下一篇文章作介绍。

一、结构化文本(ST)结构化文本(ST)是一种高级的文本语言,可以用来描述功能,功能块和程序的行为,还可以在顺序功能流程图中描述步、动作和转变的行为。结构化文本(ST)语言表面上与PASCAL语言很相似,但它是一个专门为工业控制应用开发的编程语言,具有很强的编程能力用于对变量赋值、回调功能和功能块、创建表达式、编写条件语句和迭代程序等。结构化文本(ST)非常适合应用在有复杂的算术计算的应用中。结构化文本(ST)程序格式自由,可以在关键词与标识符之间任何地方插入制表符、换行字符和注释。对于熟悉计算机高级语言开发的人员来说,结构化文本(ST)语言更是易学易用。此外,结构化文本(ST)语言还易读易理解,特别是当用有实际意义的标识符、批注来注释时,更是这样。

  1.4结构化文本(ST)程序中的条件语句条件语句的功能是,某一条件满足时执行相应的选择语句。结构化文本(ST)有如下的条件语句: l IF …THEN…ELSE条件语句该选择语句依据不同的条件分别执行相应THEN及ELSE语句。该条件语句可以嵌套入另一条件语句中,以实现更复杂的条件语句。条件语句的格式如下: IF<boolean bbbbbbbbbb_r> THEN

  1.5 结构化文本(ST)程序中的迭代语句迭代语句适用于需要一条或多条语句重复执行许多次的情况,迭代语句的执行取决于某一变量或条件的状态。应用迭代语句应避免迭代死循环的情况。 l FOR…DO 该迭代格式语句允许程序依据某一整型变量迭代。该迭代格式语句格式如下: FOR <initialize iteraion variable> TO <final value 格式基本相同。此外,结构化文本(ST)的迭代语句中还有EXIT,RETURN两种格式,分别用于程序的返回和退出。

  1.6 编程举例:用结构化文本(ST)程序编功能块本程序是一用结构化文本(ST)程序编功能块的例子。该实例描述的是如何用功能块控制箱体中的流体,箱体可以通过阀门被注满和倒空,如图所示,箱体的重量由一个称重单元监视。功能块通过比较两个输入值FullWeight和EmptyWeight以确定箱体是满的还是空的。图一 水箱控制及功能块示意图

List)语言是一种低级语言,与汇编语言很相似,是在借鉴、吸收世界范围的PLC厂商的指令表语言的基础上形成的一种标准语言,可以用来描述功能,功能块和程序的行为,还可以在顺序功能流程图中描动作和转变的行为。指令表语言能用于调用,如有条件和无条件地调用功能块和功能,还能执行赋值以及在区段内执行有条件或无条件的转移。指令表语言不但简单易学,而且非常容易实现,可不通过编译和连编就可以下载到PLC。IEC 1131-3的其它语言如功能块图、结构化文本等都可以转换为指令表语言。

2.1指令表语言结构指令表语言是由一系列指令组成的语言。每条指令在新一行开始,指令由操作符和紧随其后的操作数组成,操作数是指在IEC 1131-3的“公共元素”中定义的变量和常量。有些操作符可带若干个操作数,这时各个操作数用逗号隔开。指令前可加标号,后面跟冒号,在操作数之后可加注释。 IL是所谓面向累加器(Accu)的语言,即每条指令使用或改变当前Accu内容。IEC 1131-3将这一Accu标记为“结果”。通常,指令总是以操作数LD(“装入Accu命令”)开始。指令表程序如下所示:

  2.2 指令表操作符 IEC 1131-3指令表包括四类操作符:一般操作符、比较操作符、跳转操作符和调用操作符。

  2.2.1一般操作符符指令表一般操作符是指在程序中经常会用到的操作符. l 装入指令:LD N等。 l 逻辑指令:AND N( (与指令)、OR N( (或指令)、XOR N( (异或指令)等。 l 算术指令:ADD ((加指令)、SUB((减指令)、MUL ( (乘指令),DIV((除指令)、MOD ( (取模指令)等。 2.2.2 比较指令:GT ( (大于)、GE ( (大于等于)、EQ( (等于)、 NE( (不等于)、 LE( (小于等于)、 LT( (小于)等。 2.2.3 跳转及调用操作符 JMP C,N (跳转操作符)、 CALL C,N (调用操作符)等。

   2.3 在指令表中调用功能及功能块 在IEC 1131-3指令表的程序中,可以直接调用功能块和功能。指令表的功能块调用有种格式,功能调用有两种格式。详细的调用可见IEC 1131-3标准。

   2.4 用指令表定义功能及功能块指令表可用于定义功能块和功能。当用指令表定义功能时,功能的返回值是结果寄存内的最新值;当用指令表定义功能块时,指令表引用功能块的输入参数(VAR_bbbbb),并且把值写到输出参数(VAR_OUPUT)。

  2.5 指令表与其它语言的移植性指令表语言转换为其它语言是非常困难的,除非指令表操作符的使用范围及书写格式受到严格的限制,才有可能实现转换。IEC 1131-3的其它语言较容易转换为指令表。

  2.6 IL的编程实例本例是一个用指令表程序定义功能的实例,功能描述的计算平面上两点的移动距离。 两点X,Y的坐标如下图所示。 图二用指令表编功能实例用结构化文本描述的两点间距离的计算公式为:Travel_distance:=SQRT((X1-X2)*(X1-X2)+(Y1-Y2)*(YI-Y2)))。TMax是X,Y两点见的最大距离,当计算值小于TMax时,说明计算正确;当计算值大于TMax时,说明X,Y两点间的距离超出了最大距离,在这种情况下,功能是没有输出的。用指令表编写的该功能的函数TRAVEL()如下:

Diagram)功能块图用来描述功能、功能块和程序的行为特征,还可以在顺序功能流程图中描述步、动作和转变的行为特征。功能块图与电子线路图中的信号流图非常相似,在程序中,它可看作两个过程元素之间的信息流。功能块图普遍地应用在过程控制领域。功能块用矩形块来表示,每一功能块的左侧有不少于一个的输入端,在右侧有不少于一个的输出端,功能块的类型名称通常写在块内,但功能块实例的名称通常写在块的上部,功能块的输入输出名称写在块内的输入输出点的相应地方。

   1.1 功能块图的信号流在功能块网路中,信号通常是从一个功能或功能块的输出传递到另一个功能或功能块的输入。信号经由功能块左端流入,并求值更新,在功能块右端流输出。 l 布尔信号的取反在使用布尔信号时,功能或功能块的取反输入或输出可以在输入端或输出端用一个小圆点来表示,这种表示与在输入端或输出端加一个“取反”功能是一致的。如下图是一功能块图取反的实例。 l 信号反馈功能块图允许功能块的输出反馈回网路左侧的功能块输入,形成反馈路径。下图是一功能块反馈路径的实例,功能块Load1的输出端Level反馈回功能块Loop1的输入端ProcessValue。 1.2 功能块网路设计 功能块图的设计首先应该保证主信号流的线路清晰,避免过多的信号跨接和线路方向改变。

   1.3 功能的执行控制功能块图网路中的功能执行控制隐含地从各功能所处的位置中表现出来。每一功能的执行隐含地是由一个输入使能EN控制,该输入EN是一个布尔类型变量,允许功能有选择的求值。当输入EN为TRUE时,该功能就执行,否则,功能不执行。功能的输出ENO也是一个布尔变量,当ENO从FALSE变成TRUE就表明功能已经完成了求值。 1.4 跳转和标注功能块图允许使用“Jump”功能使得功能块图控制从程序的一个部分跳转到另一个由标识符“Lable”标识的部分继续执行。如下图是一个跳转的实例:当GasLevel的值超过0。15时,相应的控制即转移到有表识符GAS_ALARM的程序段继续执行。

  1.5 结构化文本与功能块图之间的转换特点 l 功能块图中的大部分程序能够转换为结构化文本。 l 结构化文本程序能够容易地转化为功能、功能块及其相关的参数值。 l 结构化文本直接转化为功能块网路是很困难的,IF…THEN, CASE,FOR, WHILE, REPEAT格式的语句还不能直接转换为功能块网路。

Chart)连续功能流程图是功能块图的一种特殊形式,它用于描述资源的顶层结构以及程序和功能块对任务的分配。连续功能流程图和功能块图之间的主要区别是资源和任务分配的不同。每一功能用任务的名称来描述,如图所示。程序也是箱是的情况。如果一个程序内的功能块象它的父程序一样在相同的任务下执行,任务关联是隐含的。在这种情况下,任务名称就没有必要显示在功能块中。连续功能流程图如图7所示。

  1.7 功能块图应用实例如图是一个功能块应用的实例,该实例描述了用功能块控制空气风门的情况。信号ReqOpen以及ReqClose给出了所要求的风门的位置,该位置被保存在RS双稳态功能块中,来自“bbbbbbbb” 功能块输出及转换输出用于用于产生DemandOpen和DemandClose信号,这些信号驱动风门转动到合适的位置。 图一 功能块实例图二功能块程序示意图风门上的限位开关OpenLS和CloseLS返回的是风门的实际位置信号。限位开关信号与要求的风门位置进行与比较,如果任何一个校对失败,比如风门已打开到要求的位置,而限位开关OpenLS处于false,延时计时器将起动。如果风门未按要求移动到要求的位置并且在限定的有限时间MoveTimeOut内不能确定限位开关的情况,定时器Timer1将产生Discrepancy信号。二.

   2.1 LD背景梯形图来源于美国,它基于图形表示的继电器逻辑,是PLC编程中被最广泛使用一种图形化语言。梯形图程序的左、右两侧有两垂直的电力轨线,左侧的电力轨线名义上为功率流从左向右沿着水平梯级通过各个触点、功能、功能块、线圈等提供能量,功率流的终点是右侧的电力轨线。每一个触点代表了一个布尔变量的状态,每一个线圈代表了一个实际设备的状态,功能或功能块与IEC 1131-3中的标准库或用户创建的功能或功能块相对应。一简单的梯形图程序如图(一)所示。

   2.2 IEC 1131-3的LD图形符号 IEC 1131-3中的梯形图(LD)语言是对各PLC厂家的梯形图(LD)语言合理地吸收、借鉴,语言中的各图形符号与各PLC厂家的基本一致。IEC 1131-3的主要的图形符号包括:1.触点类:常开触点、常闭触点、正转换读出触点、负转换触点。2. 线圈类:一般线圈、取反线圈、置位(锁存)线圈、复位去锁线圈、保持线圈、置位保持线圈、复位保持线圈、正转换读出线圈、负转换读出线圈。 3. 功能和功能块:包括标准的功能和功能块以及用户自己定义的功能块,图形太多这里未给出。

  2.3.1 在梯形图中连接功能块功能块能被连接在梯形图的梯级中,每一功能块有相应的布尔输入和输出量。输入量可以被梯形图梯级直接驱动,输出可以提供驱动线圈的功率流。在每一个块上至少应有一个布尔输入和布尔输出以允许功率流通过这个块。功能块可以是标准库中的也可以是自定义的。如下图二是一个在梯形图中连接功能块以驱动电动马达的实例。

  2.3.2 在梯形图中连接功能每一个功能有一个附加的布尔输入EN和布尔输出ENO。EN提供了流入功能的功率流信号;ENO提供了可用来驱动其它功能和线圈的功率流。如下图三是在梯形图中连接功能的实例,第一个功能是在三个数中取最大,第二个功能是从第一功能输出的最大数与1000.0比较,根据比较1000.0的大小来控制线圈COOL。

  2.3.3 在梯形图中有反馈回路在梯形图程序中可包含反馈回路,例如,在反馈回路中,一个或多个触点值被用作功能或功能块的输入的情况。如图三是在梯形图中有反馈回路的情况。

  2.3.4 梯形图中使用跳转和标注使用梯形图的跳转功能使得梯形图程序可以从程序的一个部分跳转到由一个标识符标识的另一部分。如下图四是在梯形图中使用跳转和标注的实例,当变量OXYGEN或PRESSURE是OFF,控制即转移到由SPARGE标识的控制程序处执行。

  2.4 ST、FBD及LD之间的可移植性 l 简单的主要包含“与”和“或”逻辑梯形图程序可以与结构化文本程序转换;在大部分的情况下,梯形图程序可以与功能块图程序进行转换。 l 用结构化文本描述的功能可以直接与梯形图、功能块转换 l 除简单的逻辑描述外,由结构化文本程序到梯形图程序的转换常常是不可能的

  2.5 梯形图编程如图五是一个用梯形图编写的火灾报警程序。FD1,FD2和FD3 是三个火灾探测器, 图三 火灾报警系统示意图 图四火灾报警系统的梯形图程序 MAN1是一个手动按钮,用来触发火灾报警。当三个探测器中的任两个或三个全部探测到有火灾情况发生时,于是Alarm_SR功能块驱动报警线圈报警。ClearAlarm按钮清除报警。当有一个探测器处于ON,相应的火灾警告指示灯亮。如果该指示灯在报警清除后继续保持亮,就表明该探测器或者有错,或者在该探测器的附近有火灾。三. 顺序功能流程图(SFC-Sequential Function Chart) 顺序功能流程图是IEC 1131-3三种图形化语言中的一种,是一种强大的描述控制程序的顺序行为特征的图形化语言,可对复杂的过程或操作由顶到底地进行辅助开发。SFC允许一个复杂的问题逐层地分解为步和较小的能够被详细分析的顺序。

  3.1 顺序功能流程图的基本概念顺序功能流程图可以由步、有向连线和过渡的集合描述。如下图反映了SFC的主要特征。 l 步步用矩形框表示,描述了被控系统的每一特殊状态。MFC中的每一步的名字应当是唯一的并且应当在MFC中仅仅出现一次。一个步可以是激活的,也可以是休止的,只有当步处于激活状态时,与之相应的动作才会被执行,至于一个步是否处于激活状态,则取决于上一步及过渡。 l 有向连线有向连线表示功能图的状态转化路线,每一步是通过有向连线连接的。 l 过渡过渡表示从一个步到另一个步的转化,这种转化并非任意的,只有当满足一定的转换条件时,转化才能发生。转换条件可以用ST、LD或FBD来描述。转换定义可以用ST、IL、LD或FBD来描述。过渡用一条横线表示,可以对过渡进行编号。 l 动作(bbbbbb)每一步是用一个或多个动作(bbbbbb)来描述的。动作包含了在步被执行时应当发生的一些行为的描述,动作用一个附加在步上的矩形框来表示。每一动作可以用IEC的任一语言如ST、FBD、LD或IL来编写。每一动作有一个限定器(Qulifier),用来确定动作什么时候执行;标准还定义了一系列限定器(Qulifier),精确地定义了一个特定与步相关的动作什么时候执行。每一动作还有一个指示器变量,该变量仅仅是用于注释。动作的表示如下图所示: 转化规则顺序功能流程图的任一步可能是激活的,也可能是休止的,与之相应的动作(bbbbbb)只有在步处于激活状态时,方能被执行,所以,步被激活和被休止的过程编确定了系统的行为。初始状态是指指令运行的开始即被激活的那个状态,这个步的标志为S0。每个过程都可以是有效的,也可以是无效的,只有紧接其前的各个阶段都处于激活状态时,过渡才是有效的,只有同时满足(1)过渡是有效的(2)过渡对应的接受特性为真,与过渡相连的下一步方能处于激活状态,同时,紧接其前的各个步全部被休止。当几个过渡可以同时被超越时,他们将同时被超越。

  3.2 顺序功能流程图(SFC)的几种主要形式按着结构的不同,顺序功能流程图(SFC)可分为以下几种形式:单序列控制、同时序列控制、分支结构序列、转移序列和起始步。

  3.3 顺序功能流程图(SFC)的程序执行顺序功能流程图(SFC)程序的执行应遵循相应的规则,每一程序组织单元(POU)与一任务(task)相对应,任务负责周期性地执行程序组织单元(POU)内的IEC程序,顺序功能流程图(SFC)内的动作也是以同样周期被执行。

  3.4 对不安全的SFC的处理 SFC编译器有能力采用相应的算法检测到某些结构不安全的SFC。如果一个完全整个流程图能分解为一个单步,该SFC就是安全的,否则是不安全的。 3.5 SFC编程举例我们现在用SFC编写一个工业电梯(lift)程序。电梯(lift)系统如图所示。电梯通过 图五 提升机示意图图六提升机控制的SFC程序一个电动绞车控制上升或下降,可按要求停止在任一楼层。当电梯将到达某一被选楼层的位置时,一微型接近开关(Proximity Switch)起作用并发出信号,让电梯减速并停在正确的位置。当电梯停下后,门微动开关(Floor Switches)起作用并将门打开。该工业电梯(lift)的MFC程序如图所示。程序从“Init”起始步开始。主要顺序从“DoorOpen”步开始,依次执行“Shutting”步、“MoveLeft”步、“Inching”步、 “Stopping”步、 “Opening”步等,最终实现对电梯的顺序控制。

}

我要回帖

更多关于 三菱plc编程口诀 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信