## S7-1200 CPU 与S7-300 PN/S7-400 PN TCP通信（S7-1200作为服务器）

S7-1200 与 S7-300 PN 口之间的以太网通信可以通过 TCP 协议来实现，使用的通信指令是在双方 CPU 调用 T-block (TSEND\_C，TRCV\_C，TCON，TDISCON，TSEND，TRCV) 指令来实现。通信方式为双边通信，因此 TSEND 和 TRCV 必须成对出现。

此外本文也可以作为S7-1200 与 S7-400 PN 之间的 TCP 通信文档。

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

所需条件：

① S7-1200(CPU1215C DC/DC/DC，固件版本V4.4)/S7-300(集成PN口)  
② TIA STEP7 V16，STEP7 V5.6

所完成的通信任务：  
  
① S7-1200 CPU将通讯数据区 DB3 块中的 10 个字节的数据发送到 S7-300 CPU的接收数据区 DB2 块中。  
② S7-300 CPU将通讯数据区 DB1 块中的 10 个字节的数据发送到 S7-1200 CPU的接收数据区 DB4 块中。

S7-1200与S7-300(集成PN口)之间 TCP 通讯，可以分3种情况来操作，具体如下：

1.  [第一种情况：S7-1200与S7-300(集成PN口)在一个项目中操作(TIA STEP7 V16)](02-S7-1200Server_S7-300PNClient.html#a)
2.  [第二种情况：S7-1200与S7-300(集成PN口)不在一个项目中的操作(两个TIA STEP7 V16项目)](02-S7-1200Server_S7-300PNClient.html#b)
3.  [第三种情况：S7-1200与S7-300(集成PN口)不在一个项目中的操作(S7-1200在TIA STEP7 V16项目中，S7-300在STEP7 V5.6项目中)](02-S7-1200Server_S7-300PNClient.html#c)

### 一. 第一种情况（S7-1200与S7-300在同一项目中操作）

使用 STEP 7 V16 在同一个项目中，新建一个S7-1200站点，一个S7-300站点，然后做 TCP 通讯。

### 1.1 S7-1200 侧和S7-300PN 侧通信的编程，连接参数及通信参数的配置

**1\. 使用 STEP7 V16 软件新建一个项目并完成硬件配置**

在 STEP7 V16的 “Portal 视图” 中选择 “创建新项目” 创建一个新项目。

**2.****添加硬件并命名PLC**  
  
然后进入 “项目视图”，在“项目树” 下双击 “添加新设备”，在对话框中选择所使用的 S7-1200 CPU 添加到机架上，命名为 PLC_1，如图1所示。  
  
![](images/2-01.JPG)

图1\. 添加新设备

为了编程方便，使用 CPU 属性中定义的时钟位，定义方法如下：  
在 “项目树” \> “PLC_1” > “设备组态” 中，选中 CPU ，然后在下面的属性窗口中，“属性” > “系统和时钟存储器” 下，将系统位定义在 MB1，时钟位定义在 MB0，如图2所示。  
系统位我们主要使用M1.0；时钟位主要使用 M0.3，它是以 2Hz 的速率在 0 和 1 之间切换的一个位，可以使用它去自动激活发送任务。

![](images/2-02.JPG)

图2\. 系统位与时钟位

**3\. 为 PROFINET 通信口分配以太网地址**

在 “设备视图”中点击 CPU 上代表 PROFINET 通信口的绿色小方块，在下方会出现 PROFINET 接口的属性，在 “以太网地址” 下分配 IP 地址为 192.168.0.1 ，子网掩码为255.255.255.0，如图3所示。

![](images/2-03.JPG)

图3\. 分配IP 地址

**4．使用 STEP7 V16 软件添加新设备****并命名 PLC_2**

与PLC\_1在同一个项目中，在“项目树” 下双击 “添加新设备”，在对话框中选择所使用的 S7-300 CPU 添加到机架上，命名为 PLC\_2，如图4所示。

![](images/2-04.jpg)

图4\. 添加新设备

为了编程方便，使用 CPU 属性中定义的时钟位，定义方法如下：  
在 “项目树” \> “PLC_2” > “设备组态” 中，选中 CPU ，然后在下面的属性窗口中，“属性” > “时钟存储器” 下时钟位定义在 MB0，如图5所示。  
时钟位我们主要使用 M0.3，它是以 2Hz 的速率在 0 和 1 之间切换的一个位，可以使用它去自动激活发送任务。

![](images/2-05.jpg)

图5\. 时钟存储位

**5\. 为 PROFINET 通信口分配以太网地址**

在 “设备视图”中点击 CPU 上代表 PROFINET 通信口的绿色小方块，在下方会出现 PROFINET 接口的属性，在 “以太网地址” 下分配 IP 地址为 192.168.0.2，子网掩码为255.255.255.0，如图6所示。  
![](images/2-06.jpg)

图6\. 分配IP 地址

**6\. 创建 CPU的逻辑网络连接**  
  
在项目树 “项目树”>“设备和网络” >“网络视图” 视图下，创建两个设备的连接。用鼠标点中 S7-1200 上的PROFINET通信口的绿色小方框，然后拖拽出一条线，到另外一个 S7-300 上的PROFINET通信口上，松开鼠标，PN/IE_1的子网连接就建立起来了，如图7所示。

![](images/2-07.jpg)

图7\. 建立两个 CPU的逻辑连接

### 1.2在 S7-1200 中调用并配置“TCON”、“TSEND”、“TRCV” 通信指令

#### **1．在 S7-1200 的 OB1 中调用“TCON” 通信指令**

① 在S7-1200 CPU 中调用发送通信指令，进入 “项目树” > “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TCON” 指令，创建连接，如图8所示。  
![](images/2-08.JPG)  
图8\. 调用“TCON”通信指令

**注意：** S7-300必须等S7-1200先准备好（触发S7-1200的TCON）后，才可以触发TCON。

② 定义 S7-1200 的 “TCON”连接参数

S7-1200 的 “TCON”指令的连接参数需要在指令下方的属性窗口“属性”> “组态”>“连接参数”中设置，如图9所示。  
![](images/2-09.jpg)

图9\. 定义 TCON 连接参数  
  
**连接参数说明：**

|     |     |
| --- | --- |
| 端点  | ：可以通过点击选择按钮选择伙伴CPU为“PLC_2，CPU315-2PN/DP” ； |
| 连接类型 | ：选择通信协议为 TCP； |
| 连接 ID | ：连接的地址 ID 号，这个 ID 号在后面的编程里会用到； |
| 连接数据 | ：点击新建自动生成该数据块，如PLC\_1\_Connection\_DB和PLC\_2\_Connection\_DB； |
| 主动建立连接 | ：选择伙伴 S7-300 作为主动连接； |
| 地址详细信息 | ：定义通信本地的端口号为：2000。 |

#### **2．定义 S7-1200 的“TSEND”发送通信块接口参数**

①　调用 “TSEND” 在OB1内调用，发送10个字节数据到 S7-300PN 中  
进入 “项目树” \> “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TSEND” 指令，如图10所示。

![](images/2-10.jpg)

图10\. 调用 TSEND

②　创建并定义S7-1200的发送数据区 DB 块。  
  
通过“项目树”>“PLC_1”>“程序块”>“添加新块”，选择“数据块” 创建 DB 块，在DB块的“属性->常规->属性”中，取消勾选“优化的块访问”，点击“确定”键，定义发送数据区为 10个字节的数组，如图11及图12所示。

![](images/2-11.jpg)  
  
图11\. 创建发送数据区 DB 块  
  
注意：对于双边编程通信的 CPU ，如果通信数据区使用 DB 块，既可以将 DB 块定义成符号寻址，也可以定义成绝对寻址。使用指针寻址方式，必须创建绝对寻址的 DB 块。

![](images/2-12.JPG)

图12\. 定义发送数据区为字节类型的数组

③　定义S7-1200 的“TSEND”发送通信块接口参数，如图13所示。

![](images/2-13.jpg)  
  
图13\. 定义 TSEND 接口参数  
  
**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| REQ | ：在上升沿启动发送作业 |
| ID  | ：引用由“TCON”建立的连接 |
| LEN | ：要通过作业发送的最大字节数 |
| DATA | ：发送数据区的数据，使用指针寻址时，DB块要选用绝对寻址 |

**输出接口参数：**

|     |     |
| --- | --- |
| DONE | ：任务执行完成并且没有错误，该位置 1 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错位信息号 |

#### **3．在 S7-1200 的OB1中调用接收指令TRCV 并配置基本参数**

为了实现 S7-1200 接收来自 S7-300PN 的数据，则在 S7-1200 中调用接收指令TRCV 并配置基本参数。

①　创建并定义S7-1200的接收数据区 DB 块。  
  
通过“项目树”>“PLC_1”>“程序块”>“添加新块”，选择“数据块” 创建 DB 块，在DB块的“属性->常规->属性”中，取消勾选“优化的块访问”，点击“确定”键，定义接收数据区为 10个字节的数组，如图14及图15所示。

![](images/2-14.jpg)  
  
图14\. 创建接收数据区 DB 块  
  
注意：对于双边编程通信的 CPU ，如果通信数据区使用 DB 块，既可以将 DB 块定义成符号寻址，也可以定义成绝对寻址。使用指针寻址方式，必须创建绝对寻址的 DB 块。

![](images/2-15.JPG)

图15\. 定义接收数据区为字节类型的数组

②　调用 “TRCV” 在OB1内调用  
进入 “项目树” \> “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TRCV” 指令，配置接口参数，如图16所示。  
  
![](images/2-16.JPG)  
图16\. 调用 TRCV 指令并配置接口参数

**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| EN_R | ：启用接收功能 |
| ID  | ：指向使用“TCON”建立的连接的引用 |
| LEN | ：接收数据长度 |
| ADHOC | ：TCP协议选项是否使用Ad-hoc模式 |
| DATA | ：接收数据区的地址 |

**输出接口参数：**

|     |     |
| --- | --- |
| NDR | ：该位为 1，接收任务成功完成 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错误信息号 |
| RCVD_LEN | ：实际接收数据的字节数 |

**注意：ADHOC设置为 TRUE 可以接收变长数据。**

### 1.3在 S7-300 中调用并配置“TCON”、“TSEND”、“TRCV” 通信指令

#### **1．在 S7-300 的 OB1 中调用“TCON” 通信指令**

① 在 S7-300 CPU 中调用发送通信指令，进入 “项目树” > “PLC_2” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通讯” > “开放式用户通信”下调用 “TCON” 指令，创建连接，如图17所示。

![](images/2-17.jpg)

图17\. 调用 TCON 通信指令

② 定义 S7-300 的 “TCON”连接参数

S7-300 的 “TCON”指令的连接参数需要在指令下方的属性窗口“属性”> “组态”>“连接参数中”中设置，如图18所示。

![](images/2-18.jpg)

图18\. 定义 TCON 连接参数

**连接参数说明：**

|     |     |
| --- | --- |
| 端点  | ：可以通过点击选择按钮选择“PLC_1”； |
| 连接类型 | ：选择通信协议为 TCP； |
| 连接 ID | ：连接的地址 ID 号，这个 ID 号在后面的编程里会用到； |
| 连接数据 | ：**选择之前已建立的数据块（如图9所示）**PLC\_2\_Connection\_DB和PLC\_1\_Connection\_DB； |
| 主动建立连接 | ：选择本地 S7-300 作为主动连接； |
| 地址详细信息 | ：定义伙伴的端口号为：2000。 |

#### **2．定义 S7-300 的“TSEND”发送通信块接口参数**

①创建并定义 S7-300 的发送数据区 DB1 块

通过“项目树”>“PLC_2”>“程序块”>“添加新块”，选择“数据块” 创建 DB1 块，点击“确定”键，定义发送数据区为 10个字节的数组，如图19所示，结果如图20所示。

![](images/2-19.jpg)

图19\. 创建发送数据区 DB 块

![](images/2-20.JPG)

图20\. 定义发送数据区为字节类型的数组

②调用 “TSEND” 在OB1内调用 发送 10 个字节数据到 S7-1200 中  
进入 “项目树” \> “PLC_2” > “程序块” > “OB1 ” 主程序中，从右侧窗口 “指令” > “通讯” > “开放式用户通信”下调用 “TSEND” 指令，配置接口参数，如图21所示。

![](images/2-21.jpg)

图21\. 调用 TSEND 指令并配置接口参数

**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| REQ | ：在上升沿启动发送作业 |
| ID  | ：引用由“TCON”建立的连接 |
| LEN | ：要通过作业发送的最大字节数 |
| DATA | ：发送数据区的数据，使用指针寻址时，DB块要选用绝对寻址 |

**输出接口参数：**

|     |     |
| --- | --- |
| DONE | ：任务执行完成并且没有错误，该位置 1 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错位信息号 |

#### **3．在 S7-300 的OB1中调用接收指令TRCV并配置参数**

①创建并定义 S7-300 的接收数据区 DB2 块。  
  
通过“项目树”>“PLC_2”>“程序块”>“添加新块”，选择“数据块” 创建 DB2 块，点击“确定”键，定义接收数据区为 10 个字节的数组，如图22所示，结果如图23所示。

![](images/2-22.jpg)

图22\. 创建接收数据区 DB2 块

![](images/2-23.JPG)

图23\. 定义接收数据区为字节类型的数组

② 将 “TRCV” 在OB1内调用  
进入 “项目树” \> “PLC_2” > “程序块” > “OB1 ” 主程序中，从右侧窗口 “指令” > “通讯” > “开放式用户通信”下调用 “TRCV” 指令，配置接口参数，如图24所示。

![](images/2-24.JPG)

图24\. 调用 TRCV 指令并配置接口参数

**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| EN_R | ：启用接收功能 |
| ID  | ：指向使用“TCON”建立的连接的引用 |
| LEN | ：接收数据长度 |
| DATA | ：接收数据区的地址 |

**输出接口参数：**

|     |     |
| --- | --- |
| NDR | ：该位为 1，接收任务成功完成 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错误信息号 |
| RCVD_LEN | ：实际接收数据的字节数 |

配置完连接并编译存盘。  

### 1.4 下载硬件组态及程序并监控通信结果

下载两个 CPU 中的所有硬件组态及程序，实现两个 CPU 之间数据交换，监控结果如图25所示。

![](images/2-25.jpg)

图25\. 监控结果

### 二. 第二种情况（S7-1200与S7-300不在同一个TIA项目中操作）

使用 STEP 7 V16 在一个项目中，新建一个S7-1200站点，在另一个项目中，新建一个S7-300站点，然后做 TCP 通讯。

### 2.1 S7-1200 侧通信的编程，连接参数及通信参数的配置

**1\. 使用 STEP7 V16 软件新建一个项目并完成硬件配置**

在 STEP7 V16的 “Portal 视图” 中选择 “创建新项目” 创建一个新项目。

**2.****添加硬件并命名PLC**  
  
然后进入 “项目视图”，在“项目树” 下双击 “添加新设备”，在对话框中选择所使用的 S7-1200 CPU 添加到机架上，命名为 PLC_1，如图26所示。  
  
![](images/2-01.JPG)

图26\. 添加新设备

为了编程方便，使用 CPU 属性中定义的时钟位，定义方法如下：  
在 “项目树” \> “PLC_1” > “设备组态” 中，选中 CPU ，然后在下面的属性窗口中，“属性” > “系统和时钟存储器” 下，将系统位定义在 MB1，时钟位定义在 MB0，如图27所示。  
系统位我们主要使用M1.0；时钟位主要使用 M0.3，它是以 2Hz 的速率在 0 和 1 之间切换的一个位，可以使用它去自动激活发送任务。

![](images/2-02.JPG)

图27\. 系统位与时钟位

**3\. 为 PROFINET 通信口分配以太网地址**

在 “设备视图”中点击 CPU 上代表PROFINET 通信口的绿色小方块，在下方会出现PROFINET 接口的属性，在 “以太网地址” 下分配IP 地址为 192.168.0.1 ，子网掩码为255.255.255.0，如图28所示。

![](images/2-03.jpg)

图28\. 分配IP 地址

### 2.2在 S7-1200 中调用并配置“TCON”、“TSEND”、“TRCV” 通信指令

#### **1．在 S7-1200 的 OB1 中调用“TCON” 通信指令**

① 在S7-1200 CPU 中调用发送通信指令，进入 “项目树” > “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TCON” 指令，创建连接，如图29所示。  
![](images/2-08.JPG)  
图29\. 调用“TCON”通信指令

**注意：** S7-300必须等S7-1200先准备好（触发S7-1200的TCON）后，才可以触发TCON。

② 定义 S7-1200 的 “TCON”连接参数

S7-1200 的 “TCON”指令的连接参数需要在指令下方的属性窗口“属性”> “组态”>“连接参数”中设置，如图30所示。  
![](images/2-26.jpg)

图30\. 定义 TCON 连接参数  
  
**连接参数说明：**

|     |     |
| --- | --- |
| 端点  | ：可以通过点击选择按钮选择伙伴CPU为“未指定” ； |
| 连接类型 | ：选择通信协议为 TCP； |
| 连接 ID | ：连接的地址 ID 号，这个 ID 号在后面的编程里会用到； |
| 连接数据 | ：点击新建自动生成该数据块，如PLC\_1\_Connection_DB； |
| 主动建立连接 | ：选择伙伴“未指定”( 本例中为S7-300) 作为主动连接； |
| 地址详细信息 | ：定义通信本地的端口号为：2000。 |

#### **2．定义 S7-1200 的“TSEND”发送通信块接口参数**

①　调用 “TSEND” 在OB1内调用 发送10个字节数据到 S7-300PN 中  
进入 “项目树” \> “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TSEND” 指令，如图31所示。

![](images/2-10.jpg)

图31\. 调用 TSEND

②　创建并定义S7-1200的发送数据区 DB 块。  
  
通过“项目树”>“PLC_1”>“程序块”>“添加新块”，选择“数据块” 创建 DB 块，在DB块的“属性->常规->属性”中，取消勾选“优化的块访问”，点击“确定”键，定义发送数据区为 10个字节的数组，如图32及图33所示。

![](images/2-11.jpg)  
  
图32\. 创建发送数据区 DB 块  
  
注意：对于双边编程通信的 CPU ，如果通信数据区使用 DB 块，既可以将 DB 块定义成符号寻址，也可以定义成绝对寻址。使用指针寻址方式，必须创建绝对寻址的 DB 块。

![](images/2-12.JPG)

图33\. 定义发送数据区为字节类型的数组

③　定义S7-1200 的“TSEND”发送通信块接口参数，如图34所示。

![](images/2-13.jpg)  
  
图34\. 定义 TSEND 接口参数  
  
**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| REQ | ：在上升沿启动发送作业 |
| ID  | ：引用由“TCON”建立的连接 |
| LEN | ：要通过作业发送的最大字节数 |
| DATA | ：发送数据区的数据，使用指针寻址时，DB块要选用绝对寻址 |

**输出接口参数：**

|     |     |
| --- | --- |
| DONE | ：任务执行完成并且没有错误，该位置 1 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错位信息号 |

#### **3．在 S7-1200 的OB1中调用接收指令TRCV 并配置基本参数**

为了实现 S7-1200 接收来自 S7-300PN 的数据，则在 S7-1200 中调用接收指令TRCV 并配置基本参数。

①　创建并定义S7-1200的接收数据区 DB 块。  
  
通过“项目树”>“PLC_1”>“程序块”>“添加新块”，选择“数据块” 创建 DB 块，在DB块的“属性->常规->属性”中，取消勾选“优化的块访问”，点击“确定”键，定义接收数据区为 10个字节的数组，如图35及图36所示。

![](images/2-14.jpg)  
  
图35\. 创建接收数据区 DB 块  
  
注意：对于双边编程通信的 CPU ，如果通信数据区使用 DB 块，既可以将 DB 块定义成符号寻址，也可以定义成绝对寻址。使用指针寻址方式，必须创建绝对寻址的 DB 块。

![](images/2-15.JPG)

图36\. 定义接收数据区为字节类型的数组

②　调用 “TRCV” 在OB1内调用  
进入 “项目树” \> “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TRCV” 指令，配置接口参数，如图37所示。  
  
![](images/2-16.JPG)  
图37\. 调用 TRCV 指令并配置接口参数

**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| EN_R | ：启用接收功能 |
| ID  | ：指向使用“TCON”建立的连接的引用 |
| LEN | ：接收数据长度 |
| ADHOC | ：TCP协议选项是否使用Ad-hoc模式 |
| DATA | ：接收数据区的地址 |

**输出接口参数：**

|     |     |
| --- | --- |
| NDR | ：该位为 1，接收任务成功完成 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错误信息号 |
| RCVD_LEN | ：实际接收数据的字节数 |

**注意：ADHOC设置为 TRUE 可以接收变长数据。**

### 2.3 S7-300PN 侧通信的编程，连接参数及通信参数的配置

**1．使用 STEP7 V16 软件新建项目，添加新设备****并命名 PLC_2**

再次打开STEP7 V16，在 STEP7 V16的 “Portal 视图” 中选择 “创建新项目” 创建一个新项目。然后进入 “项目视图”，在“项目树” 下双击 “添加新设备”，在对话框中选择所使用的 S7-300 CPU 添加到机架上，命名为 PLC_2，如图38所示。

![](images/2-04.jpg)

图38\. 添加新设备

为了编程方便，使用 CPU 属性中定义的时钟位，定义方法如下：  
在 “项目树” \> “PLC_2” > “设备组态” 中，选中 CPU ，然后在下面的属性窗口中，“属性” > “时钟存储器” 下时钟位定义在 MB0，如图39所示。  
时钟位我们主要使用 M0.3，它是以 2Hz 的速率在 0 和 1 之间切换的一个位，可以使用它去自动激活发送任务。

![](images/2-05.jpg)

图39\. 时钟存储位

**2\. 为 PROFINET 通信口分配以太网地址**

在 “设备视图”中点击 CPU 上代表PROFINET 通信口的绿色小方块，在下方会出现PROFINET 接口的属性，在 “以太网地址” 下分配IP 地址为 192.168.0.2 ，子网掩码为255.255.255.0，图40所示。  
![](images/2-06.jpg)

图40\. 分配IP 地址

### 2.4 在 S7-300 中调用并配置“TCON”、“TSEND”、“TRCV” 通信指令

#### **1．在 S7-300 的 OB1 中调用“TCON” 通信指令**

① 在 S7-300 CPU 中调用发送通信指令，进入 “项目树” > “PLC_2” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通讯” > “开放式用户通信”下调用 “TCON” 指令，创建连接，如图41所示。

![](images/2-17.jpg)

图41\. 调用 TCON 通信指令

② 定义 S7-300 的 “TCON”连接参数

S7-300 的 “TCON”指令的连接参数需要在指令下方的属性窗口“属性”> “组态”>“连接参数中”中设置，如图42所示。

![](images/2-27.jpg)

图42\. 定义 TCON 连接参数

**连接参数说明：**

|     |     |
| --- | --- |
| 端点  | ：可以通过点击选择按钮选择“未指定”； |
| 连接类型 | ：选择通信协议为 TCP； |
| 连接 ID | ：连接的地址 ID 号，这个 ID 号在后面的编程里会用到； |
| 连接数据 | ：点击新建自动生成该数据块； |
| 主动建立连接 | ：选择本地 S7-300 作为主动连接； |
| 地址详细信息 | ：定义伙伴的端口号为：2000。 |

**注意：**伙伴端口号是因为服务器（S7-1200）设置为2000，所以这里设置为2000。

#### **2．定义 S7-300 的“TSEND”发送通信块接口参数**

①创建并定义 S7-300 的发送数据区 DB1 块

通过“项目树”>“PLC_2”>“程序块”>“添加新块”，选择“数据块” 创建 DB1 块，点击“确定”键，定义发送数据区为 10个字节的数组，如图43所示，结果如图44所示。

![](images/2-19.jpg)

图43\. 创建发送数据区 DB 块

![](images/2-20.JPG)

图44\. 定义发送数据区为字节类型的数组

②调用 “TSEND” 在OB1内调用 发送 10 个字节数据到 S7-1200 中  
进入 “项目树” \> “PLC_2” > “程序块” > “OB1 ” 主程序中，从右侧窗口 “指令” > “通讯” > “开放式用户通信”下调用 “TSEND” 指令，配置接口参数，如图45所示。

![](images/2-21.jpg)

图45\. 调用 TSEND 指令并配置接口参数

**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| REQ | ：在上升沿启动发送作业 |
| ID  | ：引用由“TCON”建立的连接 |
| LEN | ：要通过作业发送的最大字节数 |
| DATA | ：发送数据区的数据，使用指针寻址时，DB块要选用绝对寻址 |

**输出接口参数：**

|     |     |
| --- | --- |
| DONE | ：任务执行完成并且没有错误，该位置 1 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错位信息号 |

#### **3．定义 S7-300 的OB1中调用接收指令TRCV 并配置基本参数**

①创建并定义 S7-300 的接收数据区 DB2 块。  
  
通过“项目树”>“PLC_2”>“程序块”>“添加新块”，选择“数据块” 创建 DB2 块，点击“确定”键，定义接收数据区为 10 个字节的数组，如图46所示，结果如图47所示。

![](images/2-22.jpg)

图46\. 创建接收数据区 DB2 块

![](images/2-23.JPG)

图47\. 定义接收数据区为字节类型的数组

② 将 “TRCV” 在OB1内调用  
进入 “项目树” \> “PLC_2” > “程序块” > “OB1 ” 主程序中，从右侧窗口 “指令” > “通讯” > “开放式用户通信”下调用 “TRCV” 指令，配置接口参数，如图48所示。

![](images/2-24.JPG)

图48\. 调用 TRCV 指令并配置接口参数

**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| EN_R | ：启用接收功能 |
| ID  | ：指向使用“TCON”建立的连接的引用 |
| LEN | ：接收数据长度 |
| DATA | ：接收数据区的地址 |

**输出接口参数：**

|     |     |
| --- | --- |
| NDR | ：该位为 1，接收任务成功完成 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错误信息号 |
| RCVD_LEN | ：实际接收数据的字节数 |

配置完连接并编译存盘。  

### 2.5 下载硬件组态及程序并监控通信结果

下载两个 CPU 中的所有硬件组态及程序，实现两个 CPU 之间数据交换，监控结果如图49所示。

![](images/2-25.jpg)

图49\. 监控结果

### 三. 第三种情况（S7-1200在TIA项目中，S7-300在STEP7项目中）

使用 STEP 7 V16 在一个项目中，新建一个S7-1200站点，使用STEP7 V5.6在一个项目中，新建一个S7-300站点，然后做 TCP 通讯。

### 3.1 S7-1200 侧通信的编程，连接参数及通信参数的配置

**1\. 使用 STEP7 V16 软件新建一个项目并完成硬件配置**

在 STEP7 V16的 “Portal 视图” 中选择 “创建新项目” 创建一个新项目。

**2.****添加硬件并命名PLC**  
  
然后进入 “项目视图”，在“项目树” 下双击 “添加新设备”，在对话框中选择所使用的 S7-1200 CPU 添加到机架上，命名为 PLC_1，如图50所示。  
  
![](images/2-01.JPG)

图50\. 添加新设备

为了编程方便，使用 CPU 属性中定义的时钟位，定义方法如下：  
在 “项目树” \> “S7-1200” > “设备组态” 中，选中 CPU ，然后在下面的属性窗口中，“属性” > “系统和时钟存储器” 下，将系统位定义在 MB1，时钟位定义在 MB0，如图51所示。  
系统位我们主要使用M1.0；时钟位主要使用 M0.3，它是以 2Hz 的速率在 0 和 1 之间切换的一个位，可以使用它去自动激活发送任务。

![](images/2-02.JPG)

图51\. 系统位与时钟位

**3\. 为 PROFINET 通信口分配以太网地址**

在 “设备视图”中点击 CPU 上代表PROFINET 通信口的绿色小方块，在下方会出现PROFINET 接口的属性，在 “以太网地址” 下分配IP 地址为 192.168.0.2 ，子网掩码为255.255.255.0，如图52所示。

![](images/2-03.jpg)

图52\. 分配IP 地址

### 3.2在 S7-1200 中调用并配置“TCON”、“TSEND”、“TRCV” 通信指令

#### **1．在 S7-1200 的 OB1 中调用“TCON” 通信指令**

① 在S7-1200 CPU 中调用发送通信指令，进入 “项目树” > “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TCON” 指令，创建连接，如图53所示。  
![](images/2-08.JPG)  
图53\. 调用“TCON”通信指令

**注意：** S7-300必须等S7-1200先准备好（触发S7-1200的TCON）后，才可以触发TCON。

② 定义 S7-1200 的 “TCON”连接参数

S7-1200 的 “TCON”指令的连接参数需要在指令下方的属性窗口“属性”> “组态”>“连接参数”中设置，如图54所示。  
![](images/2-26.jpg)

图54\. 定义 TCON 连接参数  
  
**连接参数说明：**

|     |     |
| --- | --- |
| 端点  | ：可以通过点击选择按钮选择伙伴CPU为“未指定” ； |
| 连接类型 | ：选择通信协议为 TCP； |
| 连接 ID | ：连接的地址 ID 号，这个 ID 号在后面的编程里会用到； |
| 连接数据 | ：点击新建自动生成该数据块，如PLC\_1\_Connection_DB； |
| 主动建立连接 | ：选择伙伴“未指定”( 本例中为S7-300) 作为主动连接； |
| 地址详细信息 | ：定义通信本地的端口号为：2000。 |

#### **2．定义 S7-1200 的“TSEND”发送通信块接口参数**

①　调用 “TSEND” 在OB1内调用 发送10个字节数据到 S7-300PN 中  
进入 “项目树” \> “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TSEND” 指令，如图55所示。

![](images/2-10.jpg)

图55\. 调用 TSEND

②　创建并定义S7-1200的发送数据区 DB 块。  
  
通过“项目树”>“PLC_1”>“程序块”>“添加新块”，选择“数据块” 创建 DB 块，在DB块的“属性->常规->属性”中，取消勾选“优化的块访问”，点击“确定”键，定义发送数据区为 10个字节的数组，如图56及图57所示。

![](images/2-11.jpg)  
  
图56\. 创建发送数据区 DB 块  
  
注意：对于双边编程通信的 CPU ，如果通信数据区使用 DB 块，既可以将 DB 块定义成符号寻址，也可以定义成绝对寻址。使用指针寻址方式，必须创建绝对寻址的 DB 块。

![](images/2-12.JPG)

图57\. 定义发送数据区为字节类型的数组

③　定义S7-1200 的“TSEND”发送通信块接口参数，如图58所示。

![](images/2-13.jpg)  
  
图58\. 定义 TSEND 接口参数  
  
**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| REQ | ：在上升沿启动发送作业 |
| ID  | ：引用由“TCON”建立的连接 |
| LEN | ：要通过作业发送的最大字节数 |
| DATA | ：发送数据区的数据，使用指针寻址时，DB块要选用绝对寻址 |

**输出接口参数：**

|     |     |
| --- | --- |
| DONE | ：任务执行完成并且没有错误，该位置 1 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错位信息号 |

#### **3．在 S7-1200 的OB1中调用接收指令TRCV 并配置基本参数**

为了实现 S7-1200 接收来自 S7-300PN 的数据，则在 S7-1200 中调用接收指令TRCV 并配置基本参数。

①　创建并定义S7-1200的接收数据区 DB 块。  
  
通过“项目树”>“PLC_1”>“程序块”>“添加新块”，选择“数据块” 创建 DB 块，在DB块的“属性->常规->属性”中，取消勾选“优化的块访问”，点击“确定”键，定义接收数据区为 10个字节的数组，如图59及图60所示。

![](images/2-14.jpg)  
  
图59\. 创建接收数据区 DB 块  
  
注意：对于双边编程通信的 CPU ，如果通信数据区使用 DB 块，既可以将 DB 块定义成符号寻址，也可以定义成绝对寻址。使用指针寻址方式，必须创建绝对寻址的 DB 块。

![](images/2-15.JPG)

图60\. 定义接收数据区为字节类型的数组

②　调用 “TRCV” 在OB1内调用  
进入 “项目树” \> “ PLC_1” > “程序块” > “OB1” 主程序中，从右侧窗口 “指令” > “通信” > “开放式用户通信”下调用 “TRCV” 指令，配置接口参数，如图61所示。  
  
![](images/2-16.JPG)  
图61\. 调用 TRCV 指令并配置接口参数

**参数说明：**  
**输入接口参数：**

|     |     |
| --- | --- |
| EN_R | ：启用接收功能 |
| ID  | ：指向使用“TCON”建立的连接的引用 |
| LEN | ：接收数据长度 |
| ADHOC | ：TCP协议选项是否使用Ad-hoc模式 |
| DATA | ：接收数据区的地址 |

**输出接口参数：**

|     |     |
| --- | --- |
| NDR | ：该位为 1，接收任务成功完成 |
| BUSY | ：该位为 1，代表任务未完成，不能激活新任务 |
| ERROR | ：通信过程中有错误发生，该位置 1 |
| STATUS | ：有错误发生时，会显示错误信息号 |
| RCVD_LEN | ：实际接收数据的字节数 |

**注意：ADHOC设置为 TRUE 可以接收变长数据。**

### 3.3 S7-300PN 侧通信的编程，连接参数及通信参数的配置

#### **1．创建PLC项目**

在 STEP7 V5.6中创建一个项目并插入CPU315-2PN/DP站。操作步骤如下：

(1) 在 PC 上打开 STEP7 V5.6，在 “File” 菜单中选择 “New…” 选项，如图62所示。

![](images/2-28.jpg)

图62\. 新建项目

(2) 在弹出的创建新项目窗口里输入项目名为“TCP_Server”，然后点击“OK”按钮，如图63所示。

![](images/2-29.jpg)

图63\. 输入项目名称

(3) 在TCP_Server下点击右键“Insert New Object”，选择“SIMATIC 300 Station”，如图64所示。

![](images/2-30.jpg)

图64\. 插入300站点

(4) 双击“Hardware”打开硬件组态，如图65所示。

![](images/2-31.jpg)

图65\. 硬件组态

(5) 插入 S7-300 插槽，如图66所示。

![](images/2-32.jpg)

图66\. 插入 S7-300 插槽

(6) 插入S7-300 CPU，与实际PLC一致： 6ES7 315-2EH14-0AB0 V3.2，如图67所示。

![](images/2-33.jpg)

图67\. 插入 S7-300 CPU

(7) 在弹出的“Properties-Ethernet interface PN-IO”对话框的“Parmeters”选项卡中为以太网接口添加，设置IP地址192.168.0.1和子网掩码255.255.255.0 ，如图68所示。

![](images/2-34.jpg)

图68\. 设置IP地址和子网掩码

(8)点击“New...”新建子网，如图69所示。

![](images/2-35.jpg)

图69\. 新建子网

(9) “New subnet Industrial Ethernet”对话框下 Name：Ethernet(1)，如图70所示。

![](images/2-36.jpg)

图70\. 子网名称

(10) 新建 Subnet 后，点击“OK”，如图71所示。

![](images/2-37.jpg)

图71\. 确认子网

(11)点击“Save and Compile”按钮。编译保存硬件组态信息，如图72所示。

![](images/2-38.jpg)

图72\. 保存并编译硬件组态

#### **2．TCP通信向导组态**

创建用于开放式 TCP/IP 通信的连接数据的向导 (开放式通信向导)下载链接：https://support.industry.siemens.com/cs/cn/en/view/98957840/zh

(1) 开始菜单中选择“SIMATIC”—“Open Communication Wizard”，如图73所示。

![](images/2-39.jpg)

图73\. 选择TCP通信向导

(2) 打开“Open Communication Wizard”，如图74所示。

![](images/2-40.jpg)

图74\. 打开TCP通信向导

(3) 选择 STEP 7 project，如图75所示。

![](images/2-41.jpg)

图75\. 选择 STEP 7 project

(4) 选择 TCP_Server 项目，如图76所示。

![](images/2-42.jpg)

图76\. 选择项目

(5) 选择 Block folder，如图77所示。

![](images/2-43.jpg)

图77\. 选择 Block folder

(6) 选择项目下的Blocks，如图78所示。

![](images/2-44.jpg)

图78\. 选择 Blocks

(7) 点击“Next”，如图79所示。

![](images/2-45.jpg)

图79\. 点击下一步

(8) 点击“OK”，如图80所示。

![](images/2-46.jpg)

图80\. 点击确认

(9) 点击“Next”，如图81所示。

![](images/2-47.jpg)

图81\. 点击下一步

(10) 选择“Connection type”—“TCP native”, 点击“Next”，如图82所示。

![](images/2-48.jpg)

图82\. 选择TCP通信

(11) Connect name:“300_Client”。因为 S7 300 作客户端，因此选择“Active”，如图83所示。

![](images/2-49.jpg)

图83\. 配置本地连接

(12) 选择User interface：CPU 314/315/317/ET200pro（IM154-8 CPU），如图84所示。

![](images/2-50.jpg)

图84\. 选择接口

(13) Communication parter B 的IP地址192.168.0.2，点击“Next”，如图85所示。

![](images/2-51.jpg)

图85\. 配置伙伴方连接

(14) Communication parter B 端口号：2000，点击“Next”，如图86所示。

**注意：**端口号是因为服务器（S7-1200）设置为2000，所以这里设置为2000。

![](images/2-52.jpg)

图86\. 配置端口

(15) Communication parter A，数据块Name：DB10，点击“Next”，如图87所示。

![](images/2-53.jpg)

图87\. 配置数据块

(16) 点击“Next”，如图88所示。

![](images/2-54.jpg)

图88\. 点击下一步

(17) 点击“Finish”，如图89所示。

![](images/2-55.jpg)

图89\. 点击完成

(18) 点击“是”，如图90所示。

![](images/2-56.jpg)

图90\. 点击确认

#### **3．TCP通信编程**

(1) 查看 SIMATIC Manager—Blocks 下生成了 DB10，如图91所示。

![](images/2-57.jpg)

图91\. 查看Blocks

(2) 双击 OB1进入，如图92所示。

![](images/2-58.jpg)

图92\. 点击OB1

(3) 需要的功能块，如图93所示。

![](images/2-59.JPG)

图93\. 查找功能块

(4) 插入 FB65 TCON，如图94所示

![](images/2-60.jpg)

图94\. 插入FB65

(5) 添加背景DB，如图95所示。

![](images/2-61.jpg)

图95\. 添加背景DB

(6) 打开DB10，复制“OUCW_1”名称，如图96所示。

![](images/2-62.jpg)

图96\. 复制变量名称

(7) “CONNECT”引脚输入DB10，粘贴“OUCW_1”，如图97所示。

![](images/2-63.jpg)

图97\. 连接参数

(8) 正确填写 FB65 引脚，如图98所示。

![](images/2-64.jpg)

图98\. 调用FB65

(9) 添加 Bata Block，如图99所示。

![](images/2-65.jpg)

图99\. 添加数据块

(10) 添加共享 DB1，作为发送数据区，如图100所示。

![](images/2-66.jpg)

图100\. 定义发送数据块

(11) 添加变量，类型为数组，如图101所示。

![](images/2-67.jpg)

图101\. 修改数据类型

(12) 添加10个 BYTE 的数组变量，如图102所示。

![](images/2-68.jpg)

图102\. 定义变量

(13)在S7-300项目的Hardware中，右键点击CPU，选择Object Properties->Cycle/Clock Memory，勾选“Clock memory”，输入Memory byte，如图103所示。

![](images/2-69.JPG)

图103 使用时钟存储器

(14) 添加 FB63，背景数据块为DB63，正确填写 FB63 引脚，其中REQ使用时钟存储器M30.3，以2Hz的速率在0和1之间切换的一个位，如图104所示。

![](images/2-70.JPG)

图104\. 调用FB63

(15) 添加共享 DB2，作为接收数据区，如图105所示。

![](images/2-71.jpg)

图105\. 定义接收数据块

(16) 添加变量，类型为数组。添加10个 BYTE 的数组变量，如图106所示。

![](images/2-72.jpg)

图106\. 定义变量

(17) 添加 FB64，背景数据块为DB64，正确填写 FB64 引脚，如图107所示。

![](images/2-73.jpg)

图107\. 调用FB64

### 3.4 下载硬件组态及程序并监控通信结果

#### **1\. TCP通信结果**

(1) 写入16进制数据“11 13 15 17 19 12 14 16 18 20”，如图108所示。

![](images/2-74.jpg)

图108.CPU315-2PN/DP 写入数据

(2) 触发“TSEND_REQ”，发送10个字节数据给S7-1200；触发“TRCV\_EN\_R”，接收到S7-1200发送过来的 10 个字节数据，如图109所示。

![](images/2-75.jpg)

图109.通信结果