PLC实现轻IT任务
刘阳
2025
1,前言
随着PLC处理能力和通讯能力得到长足发展,PLC也可以完成一些前辈们不可能完成的工作,比如轻型IT的任务。
2,什么是轻IT任务
SECS通讯软件就是典型的轻IT任务。
SECS通讯由美国国家半导体产业协会(SEMI)制定。几十年来SEMI发布了众多通讯协议文件,这些协议文件组成了体系完整的协议族,称为SECS协议。SECS协议跨越了从RS232时代到工业以太网时代。
SECS通讯软件运行在生产设备端,是生产设备与工厂IT系统的一种通讯接口。这个通讯接口可以完成生产设备与工厂IT系统之间的数据传输。通过这些数据传递实现生产数据上传、数据跟踪、设备远程控制、设备参数设定、设备模式管理、设备物料管理、配置报告、事件收集、终端服务等功能。由于其强大的功能,SECS通讯已经长期和广泛的应用在半导体生产领域。伴随着半导体的生产收集了大量的数据,并在这些数据分析的基础上改进半导体生产工艺从而提升半导体良品率和探索更先进的生产制成。可以讲没有SECS通讯就没有当前半导体行业的蓬勃发展。SECS通讯在半导体行业的成功激励了更多行业使用SECS通讯助力工厂数字化转型。
SECS通讯的功能强大和复杂性自然带来一个问题,就是SECS通讯软件编程比较复杂。传统实现SECS通讯的方法是在工控机上使用高级语言进行软件开发。不过这又带来新问题,负责SECS通讯的SECS计算机与负责控制生成设备的PLC之间必然产生或多或少的脱节,这就不能完成SECS通讯的系统软件,只能完成SECS通讯的应用软件。
能不能用PLC实现SECS通讯的设备端系统软件呢?这样做带来的好处是可以将控制设备的任务与SECS通讯的任务进行无缝衔接。笔者尝试在博途环境下用1500的高级语言SCL编写完成SECS系统软件的开发。效果很好,由此我联想到现在的高性能PLC都可以完成类似SECS通讯这样的轻型IT任务。
3,主旨
之前有一篇专门介绍SECS通讯的文档。那篇文档围绕着实现SECS系统通讯展开讨论。在SECS系统软件项目中,编程总计上万行文本代码,从这些代码中得取一些经验具有普遍性,本篇侧重将PLC实现轻IT任务的普遍性进行讨论。
4,文本语言与梯形图
现在的PLC都有文本编程语言,比如SCL语言。这是一种高级语言,具有现代编程语言的全部特征。PLC实现轻IT任务主要靠文本语言。这是因为IT任务大多具有触发才执行的特性。而传统的LAD语言的特性是始终执行。文本语言可以满足触发执行的特点。
5,日志功能
IT软件调试是一个困难的工作,难在一些状态的变化只在毫秒级别,很难观察到。为了方便分析问题,软件需要日志功能,记录IT系统软件在瞬间都接收到了什么消息,发送了什么消息,软件自身都做了什么。有了日志功能方便分析问题,查找问题,解决问题。

上图是SECS系统软件项目中的一个日志片段,记录了跨越500ms的日志,从23秒114毫秒到639毫秒。从日志内容分析出,PLC在500毫秒内发送和接收了7次消息对,更新了3次SECS变量。从500ms的日志中分析出PLC做出的动作都是正确的,符合SECS通讯协议。
这里简单介绍日志代码的执行步骤:首先,将软件各个模块发送到日志池中的日志进行暂存。然后加入时间等信息作为存入日志池中的信息。第二步,将之前的信息向后挪移一个日志单位,将最新的日志信息存入日志池中的最新的位置。
日志功能的代码是一个典型的事件触发的代码。大多数时间段不会触发这段代码,只有当需要记录日志时刻才执行这段代码。这也是IT任务的一个重要特征。
6,IT任务的增、删、改、查功能
轻IT任务也是IT任务,那么任务中就避免不了对数据条目的“增、删、改、查”的功能。
在SECS系统软件中,用到的增删改查的功能比较多,这里简单介绍数据追踪功能中的增删改查。厂级IT系统向本机下发数据追踪的请求。请求中包含了数据追踪的必要信息:数据量、发送频率、发送数量等信息。本机收到该信息后,就在PLC中生成了一条数据追踪条目。该条目还可以由厂级IT系统更改、删除。在执行完该追踪条目后由本机自行删除。
实现这样的功能离不开数组,也离不开遍历数组这样的代码。FOR循环语句是实现遍历数组功能的必然的选择。
7,IEC Timer的使用
SCL编程中的IEC定时器的使用习惯与LAD中IEC定时器的使用习惯不同。在IT任务中,由于SCL代码大多数时段并不运行。但是在LAD语言中,通常情况,代码是始终运行的,那么每个扫描周期都可以扫描IEC定时器。但是在SCL中,并不是每个周期都扫描到IEC定时器。如何解决呢?
我们无需担心。博图在1500和1200中对定时器的扫描机制做了调整。在300/400时代,程序只有在执行调用定时器语句时才会刷新定时器的时间。但在1X00时代,将这个刷新机制做了调整,PLC的编译系统会在访问定时器任意对象的代码位置隐性插入刷新定时器的时间的代码。这种刷新机制对于在SCL语言中使用定时器特别友好,也可以说是为了专门适配SCL语言而做改动。
8,VARIANT类型
IT任务中经常用到VARIANT类型,比如在SECS系统软件中需要定义一些变量,下图是定义EC变量的例子

块中的EC引脚数据类型是VARIANT类型。这个类型的好处是可以将任意类型拖拽到EC引脚。在块内,通过程序分辨EC引脚的变量类型,并根据分辨出的不同类型进行不同的处理。这一套处理方式已经成为了处理VARIANT类型变量的定式。
9,SCL块的ENO
如果SCL块的ENO设为自动,那么所调用的语句或者运算如果出现异常,该处的ENO会被操作系统设置为0。
在用LAD语言或者SCL语言编写的程序块中,可以在块的结尾处通过SCL语句控制程序块的ENO。比如:
ENO := TRUE; 或者 ENO := FALSE;
10,递归算法
IT任务中可能用到递归算法,比如SECS通讯中的数据是有层级结构的,SECS系统软件需要检查收到的SECS数据。SECS中的数据格式不是SECS协议规定死的。这就带来一个问题,以何为依据进行检查?SECS协议规定上一级数据必须包含本层级数据的数量的信息。检查算法就以此为依据。但是SECS协议中包含多达上百种消息,每一种消息结构都不一样,即使同一个消息,数据结构也可能不一样的。因此无法用普通算法实现对SECS数据的检查功能。
SECS数据的层级结构类似于套娃,拨开一层数据后才知道下一层数据结构。为此只能用递归算法实现SECS数据的检查功能。好在SCL语言以及博图环境支持递归算法。
递归算法中要注意嵌套的深度不要超过PLC允许的最大嵌套深度。
11,分解复杂的IT任务到多个扫描周期
PLC执行IT任务特别需要注意一点。不能使得PLC扫描周期过长。如果执行某个任务需要若干秒的时间,那么这是不可接受的。这是由于PLC还要完成对设备的控制任务。设备控制任务的扫描周期不宜超过几十毫秒。
为此,必须巧妙的将需要花费长时间运行的IT任务分解到多个扫描周期中。SCL语言可以通过多种流程控制语句较容易的实现这一点。
12,面向对象的思想
虽然当前博图编程PLC是结构化环境,但是既然STEP7中有FB的存在,就事实上有面向对象的编程基因。另外,UDT类型+程序块的IN-OUT引脚完成的是对数据指针的传递。有这2样法宝,在博图环境下实现一些简单的面向对象的编程是不难的。IT任务中应该从一开始就用面向对象的思路进行编程。这样做的好处是把一些复杂的问题简单化,让思路更清晰。
如果未来博图对PLC的编程能把函数指针开放,那么会带来更大的编程灵活性。
13,编程环境
本篇中所述及的SECS系统软件例子在博图环境下完成。由于当前很多平台均满足国际标准对PLC的要求,因此其他平台也可以在实现,比如CODESYS等。
结束语
工业自动化领域发展到当今的水平,智能制造方兴未艾,PLC承担轻IT任务必然成为趋势。SECS系统软件的开发工作证明在博图环境下完全能支撑在PLC中实现开发轻IT任务,并且轻IT任务可以与设备的控制任务实现完美无缝衔接。
本文基于半导体设备通信标准(SECS)系统软件开发实践,抽取项目开发过程中的一些内容,针对PLC实习轻IT任务进行了经验分享与总结。文中所述观点及实践方法可能存在疏漏,恳请业界同仁不吝指正。
1168

被折叠的 条评论
为什么被折叠?



