指令概述
S7-1200有两套点对点通信指令,如图1所示。
图1 指令列表
上述两组指令集的区别如下:
指令集适用范围PtP CommunicationS7-1200 中央机架CPU 版本=V4.1.1,CM1241 版本=V2.1,TIA PORTAL 版本=V13SP1,CB1241 无版本要求分布式IOCPU 版本=V4.1.1,ET200SP/ET200MP 分布式IO 串口端口模块点对点S7-1200 中央机架CPU、TIA PORTAL、CM1241、CB1241 无版本限制。建议使用PtP通讯指令集的指令,因为该指令兼容S7-1500,并且指令版本已更新,点击该点指令集将不再更新,建议仅升级旧版本项目。
指令说明
对于图2中的指令,这些是用于在线修改串口模块硬件配置的指令,例如在线修改波特率、在线修改接收条件等。一般情况下没有必要使用它。具体使用请参考TIA PORTAL帮助或S7-1200系统手册。
图2 配置说明
对于图3中的指令,这些是硬流控操作的指令,通过信号设置来激活相关的接收和发送。除非使用硬流控,否则没有必要使用。具体使用请参考TIA PORTAL帮助或S7-1200系统手册。
图3 流控指令
对于图4中的指令,这些是用于实现一些扩展功能的指令,例如与第三方设备的非标准MODBUS通信。合作伙伴不需要CRC验证。您可以使用该指令禁用MODBUS CRC。
一般情况下没有必要使用它。具体使用请参考TIA PORTAL帮助或S7-1200系统手册。
图4 扩展功能
对于图5 中的指令,这些是用于清除通信模块接收缓冲区的指令。
图5 清除缓冲区
一般情况下对于自由口通信,只使用如图6所示的发送和接收指令。
图6 发送和接收
图7 发送命令
Send_P2PSEND_PTPEN 已启用。建议始终打开REQ 来发送触发信号。使用边沿触发PORT串口硬件模块标识符,可以在PLC变量表中找到,如图9所示。BUFFER发送区一般采用P#指针形式、String类型或WString类型、字符数组等。如果使用String类型或者WString类型,对方在接收的时候是看不到字符串前面的最大长度和实际长度的,也就是说相当于发送了一个字符数组。 LENGTH 实际发送的字节数。如果为0,则全部发送。 PCTRL——无意义。 DONE 发送数据到通讯模块,发送缓冲完成。将有一个扫描周期设置ERROR 来发送错误。将设置一个扫描周期。 STATUS 通常显示状态代码。如果发生错误,则ERROR 为1 期间将显示错误信息(16#8xxx)。
图8 接收指令
当Receive_P2PRCV_PTPEN 为True 时,如果通信模块的接收缓冲区中有数据,则会发送到BUFFER 使能。建议始终打开EN_R——为True 时,如果通信模块的接收缓冲区中有数据,则会发送到BUFFERPORT 串口硬件。模块标识符可以在PLC变量表中找到,如图9所示。BUFFER接收区一般采用P#指针形式、String类型或WString类型、字符数组等。如果采用String类型或WString类型,即使伙伴发送的是字符数组,指令也会将最大长度和实际长度添加到字符数组中,成为字符串。 NDR 将通信模块接收缓冲区中的数据接收到BUFFER 后完成,并设置为一个扫描周期。如果EN_R 为True,则通信模块接收缓冲区中的数据被接收到BUFFER 中,并设置为一个扫描周期。
如果EN_R 为False,则当通信模块的接收缓冲区中有数据时,NDR 将始终为True。如果出现ERROR 指令错误,则会有一个扫描周期,其中STATUS 会被置位,并且通常会显示状态代码。发生错误时,ERROR 为1 时会显示错误信息(16# 8xxx) LENGTH 接收完成后,会有一个扫描周期显示接收到的字节数。如果通信模块接收缓冲区包含已接收n 次的数据,则Receive_P2P EN/RCV_PTP EN_R 需要在n 个扫描周期内为True 才能接收。直到BUFFER完成。
一般建议Receive_P2P EN/RCV_PTP EN_R 一直打开或打开一段时间,而不是使用边沿触发,这样一旦通信模块接收缓冲区接收到新数据,就可以立即接收到BUFFER 中。
如果可能的话,可以将接收指令放在循环OB中并尽快调用。
图9 系统常数
选择CPU中PLC变量表默认变量表
选择系统常数
找到相关的串口模块。建议直接将模块名称复制到PORT中。
发送命令、发送完成位、发送错误位、发送错误代码
下面分为点对点指令和PtP通讯指令。
图10 点对点发送相关指令
图10 PtP通信发送相关命令
程序段1:触发发送
程序段2:发送完成位触发全局变量自增1。每次完成时,变量都会增加一个数字。通过该方法可以检测发送是否完成。
程序段3:发送错误位触发MOVE指令。当发送错误到达时,该方法将STATUS变量移至全Word类型全局变量,并且发送错误代码将保存在该变量中。
接收命令、接收完成位、接收错误位、接收错误代码、接收长度
下面分为点对点指令和PtP通讯指令。
图12 点对点接收相关指令
图13 PtP通信接收相关指令
程序段4:触发接收
程序段5:接收完成位触发全局变量加1。每次完成时,变量都会增加一个数字。该方法可用于检测接收是否完成。同时,通过MOVE指令将length变量移动到UInt类型的全局变量中。接收到的长度将保存到该变量中
程序段6:接收错误位触发MOVE指令。当接收错误到来时,通过该方法将STATUS变量移动到Word类型的全局变量中,并且接收错误代码将保存在该变量中。
轮询编程
沟通任务:
1号站的S7-1200使用CB1241来发送和接收点对点指令。
Station 2的S7-1200使用ET200SP分布式IO的CMPTP模块,并使用PtP通信指令进行发送和接收。
站1 发送字符串“Siemens”,站2 发送字符串“极其深刻”。
注:本例中,1 号站先发送,2 号站先接收。实际情况根据需要而定。对于PLC来说,先发送或者先接收都可以。
示例中使用系统内存FirstScan,激活方法如图14所示。
图14 设置系统内存
进入CPU的设备视图
在Properties General下选择系统和时钟存储器
激活并启用系统内存字节,默认MB1
FirstScan变量,默认为M1.0
图15 显示了站点1 的轮询:
图15 站1 轮询
使用系统内存“FirstScan”激活首次传输
发送DONE位接收请求并复位发送请求
触发接收
接收NDR位设置发送请求,复位接收请求
触发下一次发送
图16 显示了站点2 的轮询:
图16 站2 轮询
使用系统内存“FirstScan”激活首次接收
接收到的NDR 位的上升沿置位接收请求并复位发送请求。
触发发送
发送DONE位接收请求并复位发送请求。
触发下一次接收
沟通结果:
图17 通讯结果
常见问题
如何处理字符串、字符数组等的发送和接收?
考虑到PLC通常通过空闲口与第三方通信,通信内容通常是字符串,但西门子的SIMATIC String或WString包含最大长度和实际长度,第三方字符串为Char数组或WChar数组。
基于此点对点和PtP通信命令集,对字符串和字符数组的发送和接收进行了优化,即:
第三方合作伙伴发送一个字符数组。如果PLC的接收指令BUFFER类型是字符数组,则作为字符数组接收。如果BUFFER 类型是字符串,则将其作为字符串接收。接收指令自动补全字符串的最大长度和实际长度。
第三方合作伙伴接收字符数组。如果PLC的发送指令BUFFER类型是字符数组,则发送字符数组。如果BUFFER类型是字符串,则还发送字符数组。发送指令自动去掉字符串的最大长度和实际长度。
简单来说,PLC会以字符数组的形式进行发送和接收。如果发送或接收的BUFFER是字符串,则会进行相应的转换。以上述轮询为例,见图18和图19。
图18 将Station 2的发送接收区域的String类型修改为Char数组
图19 发送和接收结果
可以知道,1号站发送字符串‘123’,2号站接收到一个字符数组,分别为‘1’、‘2’、‘3’。 2号站发送一个字符数组,每个字符为‘a’、‘b’、‘c’,1号站接收一串‘abc’。
审稿人:刘庆