• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

倍福TwinCAT使用TCP/IP协议通信例程

武飞扬头像
sygydxfwd
帮助1

倍福TCP/IP通信例程

TCP/IP知识概要

在计算机领域中,常说的TCP/IP是一个协议族,其包含了许多架构在TCP/IP协议之上的高层协议,例如HTTP,HTTPS,FTP,SNMP,POP,ICMP,NTP等,要分清楚他们直接的关系,需要引入一个大家所熟知的OSI网络模型。

OSI模型由ISO/IEC 7498-1标准所规定,该模型规定的是计算机网络体系结构,注意是针对计算机网络体系提出来的,是一个宏观的概念,抽象出来的东西,所以不必用去深究其原理。

OSI模型分为7层,所说的物理层通常是指硬件通讯电缆,接口芯片,通讯电平等相关的参数,物理层只处理比特流,且不对比特流做任何校验或检错。如果读者有单片机相关经验的话,可以类比单片机当中的一些通讯接口芯片如MAX232,其作用就是通信电平转换和比特流收发,并不对传输的信息做任何控制。

学新通

数据链路层简单来说是处理“帧”的,帧的本质是数据块,数据块本质又是一组有特定意义的0和1的组合,数据链路层的功能是对链路进行管理,决定对数据块如何封装成帧,控制帧的发送和接收频率,帧的检错等,我们熟知的MAC地址就是工作于此层,MAC地址具备硬件唯一性,一个硬件只能有一个MAC地址,且该地址全球唯一。

网络层是IP协议所在的层,IP协议在此层发挥作用,IP提供不可靠的,无连接的数据传送服务,我们所熟知的IP地址就工作于此层,IP地址的出现是为了在网络层这个层面上解决设备的寻址问题,是抽象在硬件之上的,因此IP地址不与硬件绑定,可以随便修改,因为网络一般都是动态的,可以随时增删设备。

传输层是TCP协议工作的层级,TCP克服了IP协议的缺点,提供可靠的端到端的连接,可靠是通过TCP协议常说的“三次握手,四次挥手”来实现。端到端可靠的连接,这里的端到端主要是指计算机的端口到端口。也就是说TCP保证了网络中两台计算机的端口到端口连接的可靠性。

表示层和会话层很少提及,实际使用时通常把他们的作用归到应用层当中,统称为应用层,应用层的协议很丰富,应用层是面向用户程序的,基于应用层的协议HTTP,FTP等等都是应用层的协议。当然了,倍福自己开发的ADS协议也是基于TCP/IP的应用层协议。

有的读者可能会疑惑并提出质疑:TCP/IP协议出现的更早,他用的是四层协议模型,你怎么用OSI的七层模型来解释呢?

学新通

这一个图就够解释了,可以看出来,OSI的七层模型将功能划分得更细致。

Tc2_TcpIp功能块使用

倍福提供了Tc2_TcpIp的功能块来方便用户进行TCP/IP通信的开发,该功能块可以实现PLC当server或client时所需要的一些功能。

这里以PLC做client,远端主机做server的情况介绍一下用法。TCP/IP通信需要用到socket,中文译为"套接字",其通信的整体过程可以简单概括为三步:

第一步:建立socket,绑定端口

第二步:收发数据

第三步:关闭socket,释放端口

为了调试方便,在调试电脑中下载一个netassist网络调试助手,该工具可以让调试电脑变成一台server,并以TCP协议开放指定的端口,监听端口并与client建立连接。

如图所示,假定我们的本机IP地址为169.254.2.2,开放的通信端口为50000(自己创建的端口尽量使用计算机1024之后的端口号,以免与系统预分配的端口发生冲突)

学新通

在PLC中建立一个PRG,其变量定义区域输入以下内容

PROGRAM TCPIP_TestPRG
VAR
    (* FB instance declaration*)
    fbSocketConnect:FB_SocketConnect;
    fbSocketClose:FB_SocketClose;
    fbSocketSend:FB_SocketSend;
    fbSocketReceive:FB_SocketReceive;
    (* Variable declaration*)
    sRemoteServerIpAddress:STRING:='169.254.2.2';//Remote server ip
    nPort:UDINT:=50000;// Remote server port
    sLocalClientAmsNetID:STRING:='';// Local client AmsNetId,empty string can be accepeted for local client
    nSocketID:T_HSOCKET;// socket handle
    sDataReveived :ARRAY[0..99999] OF LINT;//Reveive buffer
    nRecBytesNum:UDINT;
    bConnect:BOOL;
    bSend: BOOL;
    bReceive:BOOL;
    bClose:BOOL;
    tTimeOut:TIME :=T#5S;
    i: DINT;
END_VAR
学新通

程序区域输入以下内容

FOR i:=0 TO 99999 BY 1 DO
    sDataReveived[i]:=i 1;
END_FOR
fbSocketConnect(
    sSrvNetId:= , 
    sRemoteHost:= sRemoteServerIpAddress, 
    nRemotePort:= nPort, 
    bExecute:= bConnect, 
    tTimeout:= tTimeOut, 
    bBusy=> , 
    bError=> , 
    nErrId=> , 
    hSocket=>nSocketID );
fbSocketReceive(
    sSrvNetId:= , 
    hSocket:= nSocketID, 
    cbLen:= SIZEOF(sDataReveived), 
    pDest:= ADR(sDataReveived), 
    bExecute:= bReceive, 
    tTimeout:= tTimeOut, 
    bBusy=> , 
    bError=> , 
    nErrId=> , 
    nRecBytes=> nRecBytesNum);
fbSocketSend(
    sSrvNetId:= , 
    hSocket:= nSocketID, 
    cbLen:= SIZEOF(sDataReveived), 
    pSrc:= ADR(sDataReveived), 
    bExecute:= bSend, 
    tTimeout:= tTimeOut, 
    bBusy=> , 
    bError=> , 
    nErrId=> );
fbSocketClose(
    sSrvNetId:= , 
    hSocket:= nSocketID, 
    bExecute:= bClose, 
    tTimeout:= tTimeOut, 
    bBusy=> , 
    bError=> , 
    nErrId=> );
学新通

激活配置,并运行程序,首先确保调试电脑的TCP server已经打开,当我们将
fbSocketConnect实例的bConnect置TRUE以后,若能成功建立通信,则会返回一个handle值(句柄号),并且返回client和server双方的IP和端口号信息,如下图所示

学新通

同样的,若能成功建立起通信,netassist也会提示已经连入一个client,如下图所示

学新通

此时,我们就可以使用这个handle做进一步的收发操作了,例如我们让client往server发送数据,这里把sDataReceived这个包含100000个DINT类型元素的数组全部初始化以后,发送给server。将bSend变量置为TRUE即可。
此时再去netassist网络调试助手上看一下收到的数据,一共收到800000个字节,因为DINT是8个字节,所以100000*8=800000个字节。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcjgkc
系列文章
更多 icon
同类精品
更多 icon
继续加载