TwinCAT与Step 7编程的区别

熟悉西门子PLC编程的客户,首次使用TWINCAT PLC时,总是有一些概念要重新理解。本文根据作者个人经验,对二者做一些对比。希望做到系统、全面、正确,实际却未必做到。欢迎留言补充、指正。

二者的相同点在于都符合IEC61131-3编程标准。不同之处则包括但不限于以下几点:

1.程序执行周期

传统PLC程序按逐行扫描的模式,执行PLC代码。第一遍完成后紧接着开始第二遍扫描执行。连续两次输出更新的时间间隔是不固定的。

TWINCAT PLC要按指定的任务周期来调用程序,默认周期10ms。程序语句第一遍执行完成后,CPU处于等待状态,直到下一个任务周期触发。所以连续两次输出更新的时间间隔总是固定的(比如10ms)。

2.中断

传统PLC中有中断任务,事件发生后立即中断普通程序而执行中断程序。

TwinCAT PLC中没有中断,但是有分时多任务。在每个Base Time的Ticker,高优先级的任务先执行。最短BaseTime可以设置为50us,实际上起到了替代中断任务的作用。

3.程序组织对象

西门子中分为OB,FB和FC。控制器中预留了若干编号的OB,FB和FC,有些编号是固定有专门的用途,比如OB86、OB100、FB52等等,有些编号的对象是客户可以自由编程使用的。PLC运行时,识别这些对象的编号。对象的Symbol或者名字,主要是为了便于开发人员理解,增加程序的可读性。

TwinCAT PLC中分为PRG、FB和FC。分别对应西门子PLC中的OB、FB和FC,但PRG、FB和FC都可以自由命名,而不需要编号,所以也不限制个数。

西门子项目文件中的OB、FB和FC可以单独修改和下载,而TwinCAT PLC程序的更新则每次都是整个程序完全下载,不能单独修改和下载某个程序单元。

3.1.OB与PRG的对比

西门子PLC中预留了若干编号的OB,FB和FC,有些编号是固定有专门的用途,比如OB86、OB100、FB52等等,有些编号的对象是客户可以自由编程使用的。

TwinCAT PLC中,所有的PRG都是可以自由定义功能的,没有特殊的PRG。就算是新建程序时自动添加的MAIN程序,用户也可以重命名甚至删除。

3.2.FB的对比

西门子PLC中的FB,每实例化一次,要创建一个Shadow DB。Shadow DB也占用一个DB号。

TwinCAT PLC中的FB,每建立一个实例,要指定一个唯一的名字。一个实例的名就相当于西门子PLC中的Shadow DB。但是FB实例不用指定编号,也无须指定地址。PLC启动时会为一个FB实例分配一块独立的内存区,里面包括了对应于FB的所有接口变量和中间变量。只要不掉电,这块内存能“记忆”中间变量的值。掉电重启后,中间变量的值就清零了。

TwinCAT PLC中的FB可以嵌套FB,多个小的FB可以封装到一个大的FB中,多层嵌套的FB使模块化编程成为可能。而TC3中的FB还可以继承和扩展,程序的复用性更强。

3.3.FC的对比

西门子FC经常用作子程序或者调用其它FC,还可以操作全局变量、DB数据等。此时基本不关心FC的返回值。

TwinCAT PLC中,因为有无限可以自定义的PRG,所以通常FC仅用作立即运算出结果的函数。同一个项目中,FC可以重复运行无限多次。FC不“记忆”中间变量的值。

4.Public DB和Structure

西门子的Public DB是掉电保持的,可以自定义它的内容。定义好一个Public DB后,它的编号、名字、内部的元素类型和顺序都确定了。DB里面的值是掉电保持的。有没有相同变量元素的多个Public DB呢?Public DB内部元素,即可以用名字访问,也可以用地址偏移访问。

TwinCAT PLC中与Public DB对应的是自定义DataType中的Structure及其实例。但定义好一个Structure,只确定了它的名字和内部元素的类型和顺序。Structure要实例化之后,PLC才会为每个实例分配一块内存区。结构本身并没有地址,结构型变量才有地址,这个地址实际上只是它的第一个元素的地址,即整个结构型变量的首地址,相当于一个指针。只要不掉电,这块内存能的值就一值保留。掉电重启后,结构型变量的值也清零了。结构型变量的内部元素,完全通过名字访问。通常不再关心每个内部元素的内存地址。如果需要考虑内部元素的地址时,就需要注意不同平台的对齐模式。

TwinCAT PLC中的Structure变量要实现Public DB的功能,还要进行一些设置,才能掉电保持。Structure也可以嵌套。

5.Timer和Counter

在西门子PLC中,提供若干个定时器和计数器,比如99个或者999个或者9999个。定时器定时器之间,以ID号区分。也可以给定时器命名,但仅仅是为了便于开发人员记忆。计数器也是同样道理。定时器和计数器的数量有限,但中间值可以掉电保持。

TwinCAT PLC中,定时器和计数器,都是Standard.lib中的一个功能块。每次引用只需要命名,名字可以是任意字符,且没有数量限制。PLC重启后,如果没有特殊处理,定时器和计数器的中间值都会清零。另外,不能直接用定时器或者计数器功能块的实例名字代替它的输出点。换言之,实例名字代表的一块内存区,类似于一个Shadow DB,而不是一个BOOL型输出点。

6.上升沿和下降沿

在西门子PLC中,上升沿和下降沿类似一个函数,置于一行Ladder之中,输出立即可用。

TwinCAT PLC中,上升沿和下降沿都是Standard.lib中的一个功能块。每次引用只需要命名,名字可以是任意字符,且没有数量限制。不能直接用上升沿和下降沿功能块的实例名字代替它的输出点。换言之,实例名字代表的一块内存区,类似于一个Shadow DB,而不是一个BOOL型输出点。

7.First Cycle

在西门子PLC中,有一些特殊的标记位,比如首周期标记、1s脉冲标记等。

TwinCAT PLC中,如果需要FirstCycle标记,有两个办法,一种办法是自己建一个初始值为True的变量,在程序末尾将它置为False。另一种办法是引用TcSystem.lib库,然后就可以使用全局变量TcTaskInfoArray数组中的FirstCycle变量了。

8.1s脉冲

在西门子PLC中,有一些特殊的标记位,比如首周期标记、1s脉冲标记等。

TwinCAT PLC中,没有现成的1s脉冲标记,用户需要自己用定时器做一个。通常在项目中,可以做好常用的标记位:1s脉冲,1s方波,作为全局变量,可以在所有程序中使用。

9.Symbol和Address

在西门子PLC中,变量的关键信息是地址,所有运算的依据都是地址。特别是IO模块中各处通道的变量地址与硬件模块的安装位置严格对应。

TwinCAT PLC中,变量的关键信息是名字,在PLC启动时一个变量名就对应了一个内存地址。所有运算的依据实际上是这个内存地址。对于IO变量,哪怕它不对应对硬件模块的某个通道,也可以直接在内存中运行运算。所以TwinCAT PLC可以脱离硬件仿真运行,只有需要连接硬件的时候,才需要把PLC变量和硬件通道对应起来。

10.掉电保持Persistent

在西门子PLC中,有专门的地址区是掉电保持的。只要是定义到这个地址区的变量,都自动地掉电保持。

而在TwinCAT PLC中,所有地址区都是PC机的内存。掉电保持有多个方法实现,其中一个最简单的方法,就是直接声明某个变量为Persistent类型,这种类型的变量,在PLC关机时会自动存储到一个特殊的文件里,下次启动时又会自动从该文件恢复变量值。

11.结构和数组

TwinCAT PLC支持自定义结构。结构与西门子PLC中的DB块类似。

TwinCAT PLC支持多维数组,可以通过数组下标操作不同的元素。

12.枚举

TwinCAT PLC支持自定义枚举。

13.指针

TwinCAT PLC支持指针操作,通常用ADR()函数获取变量地址来为指针型变量赋值。然后通过指针操作变量,或者进行内存复制、内存清零或者内存拷贝。

14.自定义FB、FC和库文件

用户可以自定义STRUCTURE、Global Variable、PRG、FB和FC,可以直接导出给其它工程师使用,或者封装到Lib库文件中加密和共享。

15.面向对象编程

TwinCAT 3中的PLC支持面向对象编程,即支持FB的属性、方法,还支持对象的继承。还可以抽象出Interface的概念。