PLC编程
1编程工具 STEP 7
购买了S1200并不意味着你能免费使用它的开发软件。没关系,网上有很多破解软件。有意思的是,其中有些资源就是西门子公司的人故意释放出来的,他们可能想占有更多的市场。要对西门子的PLC 编程必须使用专用的软件:STEP 7 ,下图是 STEP 7 的安装过程。
实际上,STEP 7是过时的名称,现在西门子想将它和几个自动化软件都统一成一个平台,适用于西门子旗下所有的设备,这个平台被称为:TIAPortal(博途),本文使用的就是 TIA V13。西门子公司为了保持延续性,软件的名称有时是 STEP 7,有时又用TIA,本文我为了与历史统一还叫 STEP 7 好了。西门子的软件跟硬件一样种类繁多,光 STEP 7就有几个版本,例如专业版(professional SP1,如下图左所示),而每个版本又有不同的更新包。注意 SP1可能缺少某些功能(下面我会提到),我使用了更新包。具体来说,我使用的是 STEP 7 V13.0 SP1Upd8,如下图右所示。
在软件安装时我们注意到有这样的说明:STEP 7是用于编程的工程组态工具。要使用PLC,编程只是一方面,还有一个重要的工作就是“组态”。“组态”说白了就是“配置”,配置 PLC的输入输出接口、参数、功能等等。在“设备组态”页面选择我们的 PLC 型号就可以了。
12 西门子PLC的硬件资源要想用好PLC,就要熟悉它的一些特点,下面我们就了解一下S1215C 的特点。1215C的内存有多大呢?
我们用电脑连接上PLC,在博途软件左侧栏双击“在线和诊断”,在打开窗口中点击“存储器”,如下图所示。
可以看到这里有三个存储器,分别是:装载存储器、工作存储器和保持存储器。并且可以看到三个存储器的大小,分别是:
1. 装载存储器: 4194304 404 Byte ÷1024÷1024=4 \div 1024 \div1024= 4÷1024÷1024=4MB
2. 工作存储器: 128000 128000128000 Byte ÷1024=125 \div 1024=125÷1024=125KB
3. 保持存储器: 10240 1024010240 Byte ÷1024=10 \div 1024=10÷1024=10KB
这和系统手册中给出的数值是一样的,如下:
你看完是不是都哭了,10年前的手机存储器都比这要大。这三个存储器各有什么作用呢?
1. 装载存储器:用于存储用户项目文件(例如:用户程序、组态信息),相当于硬盘;
2. 工作存储器:CPU在执行用户程序时会将一些项目内容从装载存储区复制到工作存储区,相当于电脑的内存;
3.保持存储器:掉电后数据仍然保持。如果你希望一些数据能在断电后一直保持就要使用这个存储器。但遗憾的是,小气的西门子公司只给了我们10KB。
PLC 扫描一次程序需要多长时间呢?
PLC会自动记录时间,在同一页面,打开“循环时间”,就能看到PLC完整执行一遍程序需要的时间,如下图所示。这个时间不是固定的,取决于你的程序长短,一般的执行时间在3毫秒以内。
10.3 西门子PLC的软件资源
西门子提供哪些函数运算呢?工业控制语言唯一的guojibiaozhun——IEC61131-3规定了46个基本函数,西门子都支持。除此以外,我们常用的还有定时器等。AGV属于移动机器人,而机器人的控制本质是数学计算,我重点说说其中的数学函数,共有18个:
数字运算:ABS、SQRT、LOG、LN、EXP、SIN、COS、TAN、ASIN、ACOS、ATAN;
算术运算:ADD、SUB、MUL、DIV、MOD、EXPT、MOVE;
当然还有:>、< 比较运算符。
翻开另一款控制器品牌——倍福的手册,你会发现它同样支持这几个初级函数。
在组态界面,双击 CPU 模块能看到这款 PLC 的其它功能介绍,例如周期定时器,如下图所示。
如果你使用了触摸屏,有一点值得注意:在“保护”页面中有一个选项需要勾选:“允许从远程伙伴使用PUT/GET通信访问”,如下图所示。如果不勾选这个选项,你看你无法用触摸屏读写PLC 内存中的数据。让笔者奇怪的是,像这样的细节几乎在所有的手册、教程中都找不到,但却又很重要。
10.4 西门子PLC的编程方式
西门子PLC 的编程符合国际工业编程语言标准 IEC-611313,跟倍福等厂家的差不多。
10.4.1 定义常量
有些量我们要经常使用(例如圆周率 π\piπ),如果每次都用数值来做运算一方面输入很容易出错,另一方面如果想对其进行更改那要改很多处,非常繁琐。一个方便的做法是将其定义为一个全局的“常数”。使用PLC 和 C语言等gaoji语言相同的一点是,你需要为变量分配内存地址。分配好地址后如何对其赋值呢?因为常量只需要赋一次值即可,我们选择在Startup 块中对其赋值。Startup 块在每次 PLC 上电后只执行一次。西门子中有些块的序号是系统预留的,比如Startup 就是OB100。我们注意到,在博图软件中,全局变量用双引号表示(例如"PI"),而局部变量前面带个井号(下面会碰到)。
10.4.2 定义函数
西门子自带的函数只能完成简单的功能,为了实现更gaoji的控制我们还要自己写一些函数。笔者在开发机器人控制器的过程中发现,网上公开的PLC函数库很少,目前笔者只知道OSCAT库。大家都在讨论基本的逻辑控制,却鲜有人讨论更gaoji的数学计算,可能PLC 并不适合gaoji运动控制算法的实现。
下面我用一个很简单的进行角度弧度转换的函数为例来说明如何在 STEP 7 中自定义函数。
(1) 我们新建一个函数FC(这个函数比较简单,不需要背景数据,不用 FB),实现的语言选择 SCL语言。函数名为“DegreeToRad”。
(2) 我们要明确这个函数的输入,在上面的变量定义栏中的 Input 项目中输入 angleInDegree,类型选择为Real,如下图所示。在Return 项目中将 DegreeToRad 变量的类型改为 Real,这里注意不要修改DegreeToRad 变量的名字。
(3) 在下面的输入框输入变换公式。 这里要用 := 对变量进行赋值。你会注意到,变量 PI是用双引号括起来的,而其它的变量(例如angleInDegree)前面则带一个井号。这是用来区分局部变量和全局变量的,局部变量用#开头表示,而全局变量用引号表示。
10.4.3 定时器
定时器是我们会经常使用的一个功能,想输出随时间变化的量、想延时触发、想输出周期信号都要借助定时器。西门子的每个定时器都对应一个背景数据块。笔者早期经常犯的一个错误是,为了节省时间直接复制粘贴定时器块。其错误是不管你复制多少次,其实Zui终还是同一个定时器,后面的会覆盖前面的值。这个错误导致很多匪夷所思的错误,让笔者头疼了相当长的时间。各位一定要注意,每使用一个定时器都要重新拖进来新建。
10.4.4 磁循迹算法
为了让 AGV 始终沿着磁条行走,我们要编写相应的控制程序,也就是循迹程序。
循迹程序的逻辑可以非常简单,我们的输入是磁导航传感器的读数,输出则是舵轮转向的速度(或差速轮的转速差),磁条如果在 AGV车体中心线的左侧,我们就往左偏转,在右侧就往右偏转,而如果恰好在中间则保持不动。下面的仿真动画展示了这种控制策略的效果,其中只使用了一个传感器和一个舵轮,但已经可以沿着曲线行走了。磁导航传感器有六个点,安装在前方,红色的方格表示感应到了磁条,白色表示没有感应到。