{PLC,IOT}>ESP32 基础教程——TCP 客户端通信

一、概述

        PLC-IOT通过提供常用的物联网组件来实现相关项目的快速开发和交付,物联网组件大体上在于增强设备的通信能力,有两个部分:连接传感器(或者外设) 和 连接服务器。

        PLC-IOT提供的连接服务器的方式有:TCP 客户端、MQTT客户端和MODBUS-TCP 客户端,我们将逐一介绍,本部分介绍 PLC-IOT 的TCP 客户端通信,提供简单的示例演示使用的方法和机联网应用中设备的产量、速度监控程序。

二、TCP客户端通信功能块

        TCP客户端通信包括:

                                TCP_CLIENT    :    管理TCP 连接

                                 TCP_TX           :     通过TCP 客户端连接发送消息

                                 TCP_RX           :    处理TCP客户端接收到的消息

2.1  TCP_CLIENT 管理TCP客户端连接

输入接口

SVR    :  STRING      服务器IP地址或者域名

PORT :  UINT            服务器端口

输出接口

S         :  BOOL          连接建立成功指示,TRUE 连接建立成功,FALSE 未建立连接

C         :  INT              连接资源标识

2.2   TCP_TX    通过TCP 客户端连接发送消息

输入接口

BIN     :   BOOL          消息编码选项,TRUE  二进制,FALSE 文本,默认为 FALSE(文本)

MSG   :   STRING      消息模板,构造消息的规则

C         :   INT             连接资源标识,发送消息所使用的连接资源(TCP_CLIENT)

T          :     BOOL         触发信号,上升沿触发消息发送

输出接口

DONE :  BOOL         消息发送成功指示,  TRUE 发送成功

ERR    :   BOOL        消息发送出错指示,  TRUE 发送出错

2.3 TCP_RX 处理TCP客户端接收到的消息

输入接口

BIN     :   BOOL          消息编码选项,TRUE  二进制,FALSE 文本,默认为FALSE(文本)

MSG   :   STRING      消息模板,解析消息的规则

C         :   INT             连接资源标识,接收消息所使用的连接资源(TCP_CLIENT)

输出接口

R         :  BOOL          消息解析成功指示,TRUE 接收消息被解析成功

三、基础实验

        基础实验包括:用 python 建立 TCP服务器和客户端,基于TCP 的 IO 回环实验。

3.1   python 建立 TCP服务器和客户端

        为了完成设备通信的实验,需要有一个测试用的服务器端软件,python 在实现软件集成应用方面有独特优势——简单快速,我们用python 来做一个服务器:

import os
from socketserver import ThreadingTCPServer, StreamRequestHandler
class SVRStreamRequestHandler(StreamRequestHandler): 
    def handle(self):
        print(f"Connection from {self.client_address}")
        while True:
            d = self.request.recv(1024)
            self.request.send(d)
            print(d.decode())

if __name__ == "__main__":
    host = "" 
    port = 10086
    addr = (host, port)
    server = ThreadingTCPServer(addr, SVRStreamRequestHandler)
    print("server start")
    server.serve_forever()

        这个服务器的功能是:

                                1、将连接到服务器的客户端的IP 地址打印出来       

                                2、将接收到的消息发送回给客户端

                                3、打印接收到的消息

        我们需要确保这个服务器端软件的运行情况符合预期,利用python 来做一个客户端连接到这个服务器进行验证: 

import sys
from socket import *
from socketserver import ThreadingTCPServer, StreamRequestHandler
import traceback
def main():
    # 1.创建tcp_client_socket 套接字对象
    tcp_client_socket = socket(AF_INET,SOCK_STREAM)
    # 作为客户端,主动连接服务器较多,一般不需要绑定端口
    # 2.连接服务器
    tcp_client_socket.connect(("127.0.0.1",10086))
    while True:
        cmd = sys.stdin.readline();
        tcp_client_socket.send(cmd.encode())
        print("send:"+ cmd)
        print("recv:" + tcp_client_socket.recv(1024).decode())
    tcp_client_socket.close()
if __name__ == '__main__':
    main()

        这个客户端的功能是:

                         1、连接TCP 服务器

                         2、从命令行界面读取输入字符串

                         3、通过TCP客户端发送输入字符串

                         4、打印发送的字符串

                         5、通过TCP接收字符串

                         6、打印接收到的字符串

        运行服务端程序,可以看到     server start   的提示;

        运行客户端程序,服务器调试窗口出现  Connection from ('127.0.0.1', 60197);

        在客户端调试窗口输入     hello,可以看到运行结果:

        服务器端运行结果:

        从客户端的打印信息来看,服务器能将收到的信息原样发送出来,符合我们的实验需要。

3.2 基于TCP的IO回环实验

        IO 回环实验是以一个输入端口  (%IX0)  作为触发信号和状态信息,触发设备通过TCP 向服务器发送输入信号的状态,同时接收解析TCP的接收消息,如果匹配则将信息状态更新到一个输出端口(%QX0),辅助的,用输出端口(%QX1)展现TCP_CLIENT 实例的连接状态,输出端口(%QX5)展现发送成功状态,以及输出端口(%QX7)展现解析成功的状态。

        实验的内容包含三方面:

                1、用 TCP_CLIENT 建立连接;

                2、用 TCP_TX 实现发送消息的动作;

                3、用 TCP_RX 解析接收到的消息。

        TCP_CLIENT 的  SVR 可以是IP地址(局域网应用),也可以是服务器的域名(广域网应用)。PORT 要和服务器端开放连接的端口号一致,如果是广域网,通常还需要检验端口号是否被路由器禁用以避免进一步的排错工作。在PLC-IOT 电路板启动以后,会根据网络设置连接以太网或者WIFI,PLC-IOT 的网络设置通过开发软件工具平台的设置页面完成。我们的基础实验采用太网。

      

        网络连接后,运行服务端的python 程序,可以看到 输出端口(%QX1)的指示灯亮起来了,表明和服务器的连接建立成功。常见的情况是服务器的程序一直运行着,客户端启动后去连接服务器。我们实验让客户端先启动,然后再启动服务器程序的流程,是要检验PLC-IOT设备建立连接的可靠性:连接未建立起来的情况下,会尝试重连,直到连接成功。

        TCP_TX 和 TCP_RX 都用  连接资源标识 C 来明确其关联的TCP_CLIENT,当前的固件版本支持最多 64 个TCP 连接,如示例演示的那样,TCP_TX 和 TCP_RX 的输入接口  C  是要连接到对应的TCP_CLIENT 的输出接口 C。

        构造消息和解析消息的消息模板是一个描述信息构成和排列次序的字符串,内容由     变量引用   和    分隔符   构成,变量引用或者分隔符定义了收发信息的构成部分,变量引用或者分隔符的次序定义了对应信息在收发信息中的排列次序。消息模板的详细解释可参考《{PLC,IOT}>ESP32 基础教程 ——串口通信》。

        在输出端口(%QX1)的指示灯亮的状态下,用导线连接、断开 %IX0 和 GND,都可以看到%Q5 和 %QX7 快速闪一下,%QX0 和指示灯状态 和 %IX0 的指示灯状态保持一致,表明基于TCP 通信的IO回环验证成功。

        关闭python 服务器程序,用导线连接%IX0 和 GND,%QX1 的指示灯会熄灭,表明PLC-IOT 程序在发送的时候检测到连接错误,断开了连接,IO回环测试的一个环节断开了,回环不成功。重新启动python 服务器程序,可以看到%QX1 的指示灯亮起来,IO回环测试可以成功。

        在IO回环测试中,我们可以看服务器的输出验证客户端的发送内容。

        通过以上示例,我们可以了解物联网应用项目中服务器、客户端的快速实现方法,设备端通过TCP连接服务器的信息采集(输入)和设备控制(输出)的基本方法。

四、机联网应用中设备的产量、速度监控程序

        

        本例演示用PLC-IOT 实现机联网(工业互联网)应用中常见需求:设备产量和运行速度的数据采集。产量采集实质是传感器检测一个单位的产品制造完成时发出一个脉冲信号,PLC-IOT对此脉冲进行防抖、累加计数,设备运行速度是在设备主电机加装传感器,主电机运行一周产生一个脉冲信号,PLC-IOT 统计 20 秒内的   脉冲数量  乘以  3    就折算出每分钟的电机转数  RPM,得到的数据通过TCP 端口 10086 发给IP地址为 192.168.31.156 的服务器。对于分布各地的设备数据采集,在设备端将当地的时间也发送给服务器,可以用数据完整表达:什么时间,设备是什么状态, 有利于做时间轴有关的统计应用,本例也演示了通过 RTC 功能块获取设备的本机时间,并用日期时间构造消息的方法。服务器端的调试窗口可以看到采集的数据,采样的偏差可能导致 3 的误差,速度数据更新的周期要20秒,如果设备的运行速度比较慢,这种方法比较适合。

        计算设备运转速度还有另外一个方式:  统计获取   N   个信号的时间  T,一个信号的周期 

t = T/N

RPM = 60/t = 60*N/T

这种方式适用于速度比较快的设备。我们将用一个示例来演示这个方法。

示例中,TM 是收集10信号的时间,RPMV = 60*10/TM , 通过TCP 将信息发到电脑上对比,得到RPM数值比较统计20秒内的信号数准确,数据更新的周期也可以比较短。

五、总结

        物联网应用项目开发比较繁琐的工作是把物理信号处理成数据发给服务器去处理,在服务器端可以用的软件基础库相对丰富,具备快速开发的基础,PLC-IOT用图形化搭积木的方式,把成熟的通信功能包装成组件,方便具备软件开发能力、不熟悉嵌入式开发的人快速完成系统的集成工作。利用PLC-IOT设备的TCP 连接通信,可以快递实现数据发送到服务器,PLC-IOT 的TCP 组件还具备做系统要考虑的断线重连、故障自恢复等机制,有效保障系统可靠性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值