线下实训
HOME
线下实训
正文内容
plc编程入门word 十年工控人:常备PLC编程入门技巧,让编写的程序得到运行优化
发布时间 : 2025-05-05
作者 : 小编
访问数量 : 23
扫码分享至微信

十年工控人:常备PLC编程入门技巧,让编写的程序得到运行优化

此次给大家分享实用的PLC编程干货,总结一些编程技巧提升你的编程效率,让你所编的程序更为简单优化,从而提高程序的运行速度。接下来就来看干货!

1、根据工程实际需求,进行功能块规划,编写子程序

在PLC中子程序是为一些特定的控制目的编制的相对独立的程序。执行子程序调用指令CALL等,如果条件不满足子程序调用时,程序的扫描就仅在主程序中进行,不再去扫描这段子程序,这样就减少不必要的扫描时间。

2、用字或双字数据传送给DO点方法来控制输出

在PLC的应用中通常都会有大量的输出控制,用字或双字数据传送给DO点方法来控制输出可以提高速度,只要根据实际应用的要求,合理分配输出地址,变换控制输出控制字,可以大大减少PLC程序执行的步数,从而加快PLC的程序运行速度。

3、脉冲触发SET、RESET

PLC中,使用SET指令只执行一次即可,不必每次扫描都执行这个指令,很适合与脉冲输出(PLS/PLF)指令配合使用。有些工程人员忽视了这个问题,使用了常规的方法来驱动SET指令,无意中增加了PLC程序扫描运行时间.

4、避免了类型转换,方法如下:

以S7-200为例,它的内存格式与我们常用的PC机正好相反,它是高字在前,低字在后的。所以我们可以将字变量放在后两个字节,在程序初始化时将前两个字节清零(程序的其它地方不得使用这两个字节)。

如我们定义符号时将字变量定义在VW2,同时保持VW0的值为零。则程序中可以用VW2以字型访问该变量,同时也可以VD0以双字型访问,避免了类型转换。

为了避免使用时混淆,最好以明确的符号定义来区分字类型和双字类型。在此强烈推荐类匈牙利命名法:以前缀指示变量类型,用首字母有意义的英文单词的组合作变量名。

如以下缀:

b----字节型变量(byte)

w----字型变量(word)

d----双字变量(double)

r----实型变量(real)

f----位变量(flag)

btn---自复位按钮式输入(button)

sw----切换开关或自锁按钮输入(switch)

sig---传感器、编码等电平信号输入(signal)

rly---输出继电器位(relay)

……

当然,这个根据个人习惯来,没有定则,主要是利于自己区分:

在程序初始化时将VW0清零(如果是不需要记忆的变量,直接将dVarName清零也可)或者在数据块中将VW0设置为零。

则以后需要以字类型访问变量时就用wVarName,需要以双字类型访问变量时就用dVarName。完全不需要类型转换。

本方法可以极大的减少程序语句数,使程序更简洁、可读性更好,由于不需要做耗时的类型转换,程序运行效率也得到提高。且数学运算量越大,效率提高越明显。

缺点是要多占用两字节的内存,以后程序中不能使用VW0。但S7-200的RAM空间很大,一般是用不完的,以226为例,有多达10K的RAM,偶从来没有超过1K。这些RAM都是花钱买来的,不用白不用,不用也是浪费了。

同理,如果有字节型变量经常需要与字类型变量相互转换,让字节变量占用一个字的内存宽度浪费一个字节,避免类型转换。

关于第3点"使用SET指令只执行一次即可,不必每次扫描都执行这个指令,有些工程人员忽视了这个问题,使用了常规的方法来驱动SET指令,无意中增加了PLC程序扫描运行时间"不是很理解,能不能说得细一点。

1:如果在ob里编写子程序段,是扫描的,但是如果您编写为FC调用,那么在FC的调用条件没有满足时,FC中的程序暂时不执行。这也是所说节省时间的意思。

2:PLC的执行步数根据程序长短会不同,扫描时间会根据执行步数的不同而不同,如果用一个mov指令完成8个数字量输出的控制,当然比用8个mov指令完成8个数字量输出的控制所需要的程序步数少。

这些PLC编程优化技巧,大伙可以借鉴一下,看看对于自己有没有得提高!

以上,欢迎动动手分享及收藏!

S7-1200plc作为从站的编程详解

S7-1200 作为Modbus RTU 从站

S7-1200 支持Modbus RTU通信模式的模块可作为Modbus RTU从站。以下以 CPU1215C DC/DC/DC和CM1241 RS485为例,介绍S7-1200 Modbus RTU 从站通信组态及编程步骤。

硬件和软件需求及所完成的通信任务:

硬件: ① CPU1215C DC/DC/DC (订货号:6ES7 215-1AG31-0XB0)② CM1241 RS485 (订货号:6ES7 241-1CH30-0XB0)③ PS 307电源(订货号:6ES7307-1KA02-0AA0) ④ PC(带以太网卡) ⑤ TP以太网电缆软件: ① STEP 7 V11 Professional SP2 UPD4 +HSP② ModScan(该软件是第三方软件,可以从 Internet 网络下载)所完成的通信任务: 将Modbus RTU从站CPU1215C中地址从DB1.DBW0开始的5 个字中的数据,分别读取到Modbus RTU主站ModScan中Modbus地址从40001开始的5个字中。

1 组态Modbus RTU通信模块

在硬件目录里找到“通信模块”→“点到点” “CM1241(RS485)”,双击或拖拽此模块至CPU左侧即可,如下图1所示:

图1 组态通信模块

接下来,在“设备视图”中用鼠标选中CM1241(RS485)模块,在“属性”→“端口组态”中配置此模块硬件接口参数。如下图2所示:

以下以传输率=9.6Kbps,奇偶校验=无奇偶校验,数据位=8位字符,停止位=1,其它保持默认设置为例。

图2 RS485 端口设置

最后在“硬件标识符”里确认一下硬件标识符为271,如下图3所示:

图3 硬件标识符

2 添加启动OB

在项目树下选择“CPU1215C DC/DC/DC”→“程序块”→“添加新块”,在弹出的窗口中选择“OB 组织块”→ “Startup”,添加启动OB 100,如下图4所示:

图4 添加启动OB

3 调用MB_COMM_LOAD指令

为使端口一启动就被设置为Modbus RTU通信模式,可在OB 100中调用“MB_COMM_LOAD”指令。调用“MB_COMM_LOAD”指令时会自动弹出创建相应背景数据块的界面,如下图5所示:

图5 调用MB_COMM_LOAD指令

点击“确认”为该指令创建背景数据块后,为各输入/输出引脚分配地址。尤其需注意MB_DB输入引脚需指向“MB_SLAVE”指令的背景数据块,如下图6所示:

注意: “MB_COMM_LOAD”指令输入位“REQ”需使用上升沿触发。由于OB 100只在S7-1200启动时执行一次,因此,此例中将“REQ”设为“TRUE”。

图6 MB_COMM_LOAD指令

MB_COMM_LOAD指令参数意义如下表1所示:

引脚

说明

EN

使能端

REQ

在上升沿执行该指令

PORT

通信端口的硬件标识符

BAUD

波特率选择:3600,6000,12000,2400,4800,9600,19200,38400,57600,76800,115200 (注意:所有其它值均无效)

PARITY

奇偶检验选择:0-无;1-奇校验;2-偶校验

FLOW_CTRL

流控制选择:0-(默认值)无流控制

RTS_ON_DLY

RTS延时选择:0-(默认值)

RTS_OFF_DLY

RTS关断延时选择:0-(默认值)

RESP_TO

响应超时:默认值 = 1000 ms。MB_MASTER 允许用于从站响应的时间(以毫秒为单位)。

MB_DB

对 MB_MASTER 或 MB_SLAVE 指令所使用的背景数据块。

DONE

完成位:指令执行完成且未出错置1

ERROR

错误位:0-未检测到错误;1-检测到错误。在参数STATUS中输出错误代码。

STATUS

表1 MB_COMM_LOAD指令参数意义

4 创建MB_HOLD_REG数据块

通过“程序块”→ “添加新块”,选择“数据块(DB)”创建 DB 块,选择“标准与S7- 300/400兼容” ,点击“确认”键,定义数据区为5个字的数组,如下图7所示:

注意:MB_HOLD_REG使用的DB访问类型必须是标准与S7- 300/400兼容。

图7 创建MB_HOLD_REG数据块

5 调用MB_SLAVE指令

在OB1中调用MB_SLAVE指令, 调用该指令时会自动弹出创建相应背景数据块的界面,如下图8所示:

图8 调用MB_SLAVE指令

点击“确认”为该指令创建背景数据块后,并为各输入/输出引脚分配地址,如下图9所示:

S7-1200作为Modbus RTU从站,MB_HOLD_REG指向Modbus保持寄存器数据块的指针。设置如下所示:MB_HOLD_REG=P#DB3.DBX0.0 WORD 5。

对应关系如下表2所示:

Modbus RTU主站Modbus地址

Modbus RTU从站CPU1215C 数据缓冲区地址

40001

DB3.DBW0

40002

DB3.DBW2

40003

DB3.DBW4

40004

DB3.DBW6

40005

DB3.DBW8

表2 Modbus地址对应关系

图9 MB_SLAVE指令

引脚

说明

EN

使能端

MB_ADDR

Modbus 从站的站地址 。默认地址范围:0 至 247;扩展地址范围:0 至 65535

MB_HOLD_REG

指向 Modbus 保持寄存器数据块的指针。必须使用“标准 - 与 S7-300/400 兼容”访问类型创建该数据块。

NDR

新数据就绪:0-无新数据;1-表示Modbus主站已写入新的数据

DR

数据读取:0-无数据读取;1-表示Modbus主站已读取新的数据

ERROR

错误位

STATUS

表3 MB_SLAVE指令参数意义

MB_SLAVE Modbus功能

S7-1200

代码

功能

数据区

地址范围

数据区

CPU地址

01

读位

输出

1到8192

输出过程映像区

Q0.0到Q1023.7

02

读位

输入

10001到18192

输入映像区

I0.0到I1023.7

04

读字

输入

30001到30512

输入映像区

IW0到IW1022

05

写位

输出

1到8192

输出过程映像区

Q0.0到Q1023.7

15

写位

输出

1到8192

输出过程映像区

Q0.0到Q1023.7

表4 Modbus地址到过程映象区的映射

MB_SLAVE Modbus功能

S7-1200

代码

功能

数据区

地址范围

CPU DB数据区

CPU地址

03

读字

保持寄存器

40001到49999

MB_HOLD_REG

字1到字9999

400001到465535

字1到字65535

06

写字

保持寄存器

40001到49999

MB_HOLD_REG

字1到字9999

400001到465535

字1到字65535

16

写字

保持寄存器

40001到49999

MB_HOLD_REG

字1到字9999

400001到465535

字1到字65535

表5 Modbus地址到CPU存储区的映射

6 Modbus 主站软件设置

注意: 客户机采用ModScan软件测试,该软件是第三方软件,可以从 Internet 网络上下载。

首先在打开的ModScan软件中建立连接,并设置RTU模式的参数:波特率Baud=9600,数据位Data=8,停止位Stop=1,校验Parity=NONE,如下图10所示:

图10 建立ModScan连接

选择“File” “New” 打开ModScan通信界面,设置Modbus RTU从站的地址Device Id=1,数据开始地址Address=0001,数据长度Length=5,Modbus数据类型功能码03,如下图11所示:

注意: Device Id设置必须与“MB_SLAVE”指令中输入引脚“MB_ADDR”设置的地址一致。

图11 设置ModScan

7 Modbus RTU测试结果

在STEP 7 V11 Professional SP2 UPD4软件中打开该项目CPU1215 DC/DC/DC的“监控表”,对DB3.DBW0写入数值21,DB3.DBW2写入数值22,DB3.DBW4写入数值23,DB3.DBW6写入数值24,DB3.DBW8写入数值25。ModScan主站将S7-1200 Modbus RTU从站地址DB3.DBW0的数值21,DB3.DBW2的数值22,DB3.DBW4的数值23,DB3.DBW6的数值24,DB3.DBW8的数值25,分别读取到了地址40001,40002,40003,40004,40005中。如下图12所示:

图12 Modbus RTU测试结果

MB_COMM_LOAD和MB_SLAVE指令STATUS错误代码

STATUS(W#16#)

说明

0000

端口无错误

8180

端口ID值无效

8181

波特率值无效

8182

奇偶校验值无效

8183

流控制值无效

8184

响应超时值无效

8185

MB_DB参数不是MB_MASTER或MB_SLAVE的背景数据块

表6 MB_COMM_LOAD指令STATUS错误代码

STATUS(W#16#)

说明

0000

无错误

80D1

接收方发出了暂停主动传输的流控制请求并且在指定的等待时间内未重新激活该传输

80D2

传送请求终止

80E0

因接收缓冲区满,消息被终止

80E1

因出现奇偶校验错误,消息被终止

80E2

因组帧错误,消息被终止

80E3

因出现超限错误,消息被终止

80E4

因指定长度超出总缓冲区大小,消息被终止

8180

无效端口ID值或MB_COMM_LOAD指令出错

8186

Modbus站地址无效

8187

指向MB_HOLD_REG指针无效

818C

指向M存储器或DB(DB区域允许符号地址和直接地址)的MB_HOLD_REG指针无效

表7 MB_SLAVE指令STATUS参数意义(通信和组态错误)

STATUS(W#16#)

从站的响应代码

说明

8380

无响应

CRC错误

8381

01

不支持功能代码或者在广播中不支持功能代码

8382

03

数据长度错误

8383

02

数据地址错误或地址超出DATA_PTR取的有效范围

8384

03

数据值错误

8385

03

不支持此数据诊断代码值

表8 MB_SLAVE指令STATUS参数意义(Modbus协议错误)

常见问题

为什么触发“MB_SLAVE”指令出错,输出位“ERROR”=1,输出状态字“STATUS”=16#8187?

输出状态字”STATUS“=16#8187表示指向MB_HOLD_REG指针无效。以下两种情况会造成如上错误:

程序中不存在“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块。在创建“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块时选择了“仅符号寻址”。

解决方法分别如下:

新建“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块。创建“MB_SLAVE”指令的输入引脚“MB_HOLD_REG”对应的DB块时只能选择了“标准与S7-300/400兼容”。      

爱上电气 我是电气工程师,分享电气知识;【重要提示】请点击关注,然后进入

公众号

相关问答

plc编程入门教程?

步骤/方式2星--三角起动主线路图设计出来以后,就可以把实物接触器线路接好,等待备用。步骤/方式3星--三角起动PLC接线图设计,把I/O点标号做好,以免接线的...

plc编程入门教程做什么的?

主要讲解PLC的基本组成,基本编程和网络通讯等主要讲解PLC的基本组成,基本编程和网络通讯等

plc编程入门怎么学?

1、养成良好的兴趣既然都对PLC编程没有兴趣,那怎么可能学好呢。因此可以把编程当成一项趣味的智力游戏,这样就会促使你有足够及毅力耐心去完成编程。2.PLC学...

plc编程入门怎么学?

1、养成良好的兴趣既然都对PLC编程没有兴趣,那怎么可能学好呢。因此可以把编程当成一项趣味的智力游戏,这样就会促使你有足够及毅力耐心去完成编程。2.PLC学...

怎么通过电脑读出PLC程序-ZOL问答

不管是什么PLC读取PLC程序的方法基本都一样。第一步:在电脑上安装与PLC对应的编程软件(一般买PLC时就随机带光盘,没有就网上下载)第二步:要有该PLC对应的数据...

零基础怎么学PLC编程?

学习PLC编程,需要从以下几个方面入手:学习PLC基础知识,包括PLC的组成、工作原理、常见元器件等;学习PLC编程语言,包括指令集、程序结构、变量类型等;了...

怎样自学plc编程入门?四川成都怎样自学plc编程入门

[回答]四川成都怎样自学plc编程入门,四川学PLC编程、plc编程培训、电工培训、PLC电工培训学校有成都万通高级技工学校,开设PLC编程基础知识培训课程,从基...

干的自动化电工,现在想学plc编程,有没有快速入门的方法?

我就买个便宜的二手货,先学一种,网上系列教程比较多,按教程从简单到复杂的学习就行了。没有什么快速的方法,你要编写简单的程序,以及编程软件使用几天就会...

PLC编程入门要多久?

一个月。PLC编程入门要一个月时间。PLC编程专为在工业环境下应用而设计。它采用可编程序的存储器,用来在其内部编辑的应用。一个月。PLC编程入门要一个月时...

计算机编程入门教程?

其实很多计算机专业的人,也不是对这些概念都很懂的。3.数据结构与算法学完C语言基础之后,想必已经能解决一些基本的编程问题了。题主可以试着去做书上提供的...

 令狐安简历  dream.e 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2025  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部