PLC一般是给没有计算机基础的电气从业人员使用的计算机控制系统,其特点是整合了常见的外围部件(特别是隔离型GPIO、定时器、通讯模块等)、工业级(抗干扰性好,皮实)、编程语言直观(梯形图,一种类似继电器控制的图形语言)。
对于PLC的编程语言,工业界有一些标准,主要有梯形图(LAD-LAdder Diagram)、顺序功能图(SFC-Seauential Fuction Chart)、语句表(STL-STatement List)、功能块图(FBD-Function Block Diagram)、结构化文本(ST-Structured Text)这五种。从本质上来看,PLC的这些编程语言最终需要转化为PLC使用的CPU的特定机器语言(编译执行或解释执行),因此也有使用C、Java这样的通用高级语言来给PLC编程的。 但是工业标准的语言其中的一些编程思想和编程习惯往往能够很好的适应工业应用的场合,对于传统的电气从业人员来说,适应性佳,也有很大的优势。
研究西门子的STL语言指令集可以发现,这套指令集并不是传统的CPU指令集。从某种意义上来说,是一个CCCCCISC指令集(复复复复杂指令集),很多指令都是针对工业控制的常用形态添加的。ARM架构的RISC指令集是很小的,其实X86的CISC指令集也没有多大。
ADC | 带进位的32位数加法 |
ADD | 32位数相加 |
AND | 32位数的逻辑与 |
B | 在32M空间内的相对跳转指令 |
BIC | 32位数的逻辑位清零 |
BKPT | 断点指令 |
BL | 带链接的相对跳转指令 |
BLX | 带链接的切换跳转 |
BX | 切换跳转 |
CDP CDP2 | 协处理器数据处理操作 |
CLZ | 零计数 |
CMN | 比较两个数的相反数 |
CMP | 32位数比较 |
EOR | 32位逻辑异或 |
LDC LDC2 | 从协处理器取一个或多个32位值 |
LDM | 从内存送多个32位字到ARM寄存器 |
LDR | 从虚拟地址取一个单个的32位值 |
MCR MCR2 MCRR | 从寄存器送数据到协处理器 |
MLA | 32位乘累加 |
MOV | 传送一个32位数到寄存器 |
MRC MRC2 MRRC | 从协处理器传送数据到寄存器 |
MRS | 把状态寄存器的值送到通用寄存器 |
MSR | 把通用寄存器的值传送到状态寄存器 |
MUL | 32位乘 |
MVN | 把一个32位数的逻辑“非”送到寄存器 |
ORR | 32位逻辑或 |
PLD | 预装载提示指令 |
QADD | 有符号32位饱和加 |
QDADD | 有符号双32位饱和加 |
QSUB | 有符号32位饱和减 |
QDSUB | 有符号双32位饱和减 |
RSB | 逆向32位减法 |
RSC | 带进位的逆向32法减法 |
SBC | 带进位的32位减法 |
SMLAxy | 有符号乘累加(16位*16位)+32位=32位 |
SMLAL | 64位有符号乘累加((32位*32位)+64位=64位) |
SMALxy | 64位有符号乘累加((32位*32位)+64位=64位) |
SMLAWy | 号乘累加((32位*16位)>>16位)+32位=32位 |
SMULL | 64位有符号乘累加(32位*32位)=64位 |
SMULxy | 有符号乘(16位*16位=32位) |
SMULWy | 有符号乘(32位*16位>>16位=32位) |
STC STC2 | 从协处理器中把一个或多个32位值存到内存 |
STM | 把多个32位的寄存器值存放到内存 |
STR | 把寄存器的值存到一个内存的虚地址内间 |
SUB | 32位减法 |
SWI | 软中断 |
SWP | 把一个字或者一个字节和一个寄存器值交换 |
TEQ | 等值测试 |
TST | 位测试 |
UMLAL | 64位无符号乘累加((32位*32位)+64位=64位) |
UMULL | 64位无符号乘累加(32位*32位)=64位 |
以一款仿S7-200的国产PLC为例(http://item.taobao.com/item.htm?spm=a230r.1.10.2.GTu2xH&id=12911303220),其完全兼容正版西门子的产品。它使用的CPU核心是NXP LPC2138,是一款ARM7TDMI-S架构的RISC处理器。我们知道,使用STEP 7软件进行PLC编程时,其所有形式的语言最终会转换成一个PLC指令集(SIMATIC/IEC1131),相当于一个专门为工业控制使用的汇编指令集。首先,这个指令集不是ARM的指令集,不能直接使用;其次,PLC的整个执行过程(In I/O扫描 --> 用户程序 --> Out I/O扫描),是需要操作系统控制的。因此,PLC标准指令集可能是被预先编译成ARM指令集,也有可能是操作系统实时解释执行的。由于ARM内核的主频其实是很高的(LPC2138可达300M),而工控的主频往往不到1M(计算量小),其实CPU负载应该很小,因此后者的可能性比较大。 这款PLC的PCB设计和结构设计从工艺上来说也很符合“皮实”的目标。
========================================================================
下面是PLC编程语言的介绍:不同的商家的PLC有不同的编程语言,但就某个商家而言,PLC的编程语言也就那么几种。下面,以西门子PLC的编程语言为例,说明一下,各种编程语言的异同。其中,STL类似于汇编语言,ST类似于高级语言如pascal或C,其他都是图形化的,如LAD类似电气图,FBD类似数字逻辑图。
1、顺序功能图(SFC-Seauential Fuction Chart)
这是位于其它编程语言之上的图形语言,用来编程顺序控制的程序(如:机械手控制程序)。编写时,工艺过程被划分为若干个顺序出现的步,每步中包括控制输出的动作,从一步到另一步的转换由转换条件来控制,特别适合于生产制造过程。
西门子STEP7中的该编程语言是S7 Graph。
2、梯形图(LAD-LAdder Diagram)
这是使用使用最多的PLC编程语言。因与继电器电路很相似,具有直观易懂的特点,很容易被熟悉继电器控制的电气人员所掌握,特别适合于数字量逻辑控制。
梯形图由触点、线圈和用方框表示的指令构成。触点代表逻辑输入条件,线圈 代表逻辑运算结果,常用来控制的指示灯,开关和内部的标志位等。指令框用来表示定时器、计数器或数学运算等附加指令。
在程序中,最左边是主信号流,信号流总是从左向右流动的。
不适合于编写大型控制程序。
3、语句表(STL-STatement List)
是一种类似于微机汇编语言的一种文本编程语言,由多条语句组成一个程序段。语言表适合于经验丰富的程序员使用,可以实现某些梯形图不能实现的功能。
4、功能块图(FBD-Function Block Diagram)
功能块图使用类似于布尔代数的图形逻辑符号来表示控制逻辑,一些复杂的功能用指令框表示,适合于有数字电路基础的编程人员使用。功能块图用类似于与门、或门的框图来表示逻辑运算关系,方框的左侧为逻辑运算的输入变量,右侧为输出变量,输入、输出端的小圆圈表示“非”运算,方框用“导线”连在一起,信号自左向右。
5、结构化文本(ST-Structured Text)
结构化文本(ST)是为IEC61131-3标准创建的一种专用的高级编程语言。与梯形图相比,它实现复杂的数学运算,编写的程序非常简洁和紧凑。
STEP7的S7 SCL结构化控制语言,编程结构和C语言和Pascal语言相似,特别适合于习惯于使用高级语言编程的人使用。
以上几种编程语言是用的比较多的几种,其它用的相对较少,就不介绍了。