TwinCAT3以太网TCP/IP自由协议通讯

article/2025/10/3 13:40:58

目录

一、TwinCAT3以太网TCP/IP客户端创建

1、系统连接示意图

1、程序创建

(1)工程创建和授权添加

 (2)库文件添加

 (3)变量创建

(4)程序

2、测试

(1)网络调试助手创建服务端监听

(2)PLC端的Client连接服务端

 (3)PLC端给服务端发送数据

 (4)服务端给PLC发送数据

二、TwinCAT3以太网TCP/IP服务端创建

1、系统连接示意图

2、程序创建

(1)变量创建

(2)程序

3、测试

(1)Listen、客户端连接

 (2)服务端中Accept接收请求

(3)服务端和客户端之间相互发送数据

三、工程下载连接

1、 TwinCAT3以太网TCP/IP客户端测试程序

2、 TwinCAT3以太网TCP/IP服务端测试程序


测试之前需要在PLC的window系统里安装TCP/IP软件吧包,安装完成关电重启。安装包在提供的工程下载连接中。

一、TwinCAT3以太网TCP/IP客户端创建

1、系统连接示意图

PLC作为客户端去连接TCP服务端。

1、程序创建

(1)工程创建和授权添加

创建TwinCAT3工程,创建PLC程序,在配置模式下进行IO扫描。License中勾选TCP/IP授权,7天免费试用。

 (2)库文件添加

实验需要用到4个功能块,分别是FB_SocketConnect(用于建立连接),FB_SocketSend(用于发送),FB_SocketReceive(用于接收),FB_SocketClose(用于关闭连接)

 (3)变量创建

PROGRAM SocketClient
VAR_FB_SocketConnect:						FB_SocketConnect;				//用于建立连接_FB_SocketSend:							FB_SocketSend;					//用于发送_FB_SocketReceive:						FB_SocketReceive;				//用于接收_FB_SocketClose:						FB_SocketClose;					//用于关闭连接_hSocket:								T_HSOCKET;						//Socket连接句柄_ServerIpAddress:						T_IPv4Addr:='192.168.1.33';		//要连接Socket Server的ip地址_ServerPort:							UDINT:=6666;bConnect:								BOOL;bSend:									BOOL;//bRecevie:								BOOL;bClose:									BOOL;boConnectErr:							BOOL;nSendByteLength:						UDINT:=9;						//需要发送的字节数	//nReceiveByteLength:						UDINT:=20;arrSendData:							ARRAY[1..10]		OF			BYTE;arrrReceiveData:						ARRAY[1..100]		OF			BYTE;Timer1:									TON;Send_R_TRIG:							R_TRIG;END_VAR

(4)程序


arrSendData[1]	:=	16#11;
arrSendData[2]	:=	16#22;
arrSendData[3]	:=	16#33;
arrSendData[4]	:=	16#44;
arrSendData[5]	:=	16#55;
arrSendData[6]	:=	16#66;
arrSendData[7]	:=	16#77;
arrSendData[8]	:=	16#88;
arrSendData[9]	:=	16#99;
arrSendData[10]	:=	16#A0;//
_FB_SocketConnect(sSrvNetId:= , sRemoteHost:= _ServerIpAddress, 		//要连接Socket Server的ip地址nRemotePort:= _ServerPort,				//要连接Socket Server的端口号bExecute:= bConnect, tTimeout:= T#1S, bBusy=> , bError=> boConnectErr, nErrId=> , hSocket=> _hSocket);//
Send_R_TRIG(CLK:= bSend, Q=> );
_FB_SocketSend(sSrvNetId:= , hSocket:= _hSocket, //cbLen:= SIZEOF(arrSendData),			//1、将整个数组发送过去cbLen:= nSendByteLength, 				//2、将指定的字节数发送过去pSrc:= ADR(arrSendData), bExecute:= Send_R_TRIG.Q, tTimeout:= T#1S, bBusy=> , bError=> , nErrId=> );//500ms接收一次
Timer1(IN:= NOT timer1.q, PT:=T#500MS , Q=> , ET=> );	
_FB_SocketReceive(sSrvNetId:= , hSocket:= _hSocket, cbLen:= SIZEOF(arrrReceiveData), pDest:= ADR(arrrReceiveData), //bExecute:= bRecevie, bExecute:= bConnect AND NOT boConnectErr AND Timer1.Q, tTimeout:= T#1S, bBusy=> , bError=> , nErrId=> , nRecBytes=> );//
_FB_SocketClose(sSrvNetId:= , hSocket:= _hSocket, bExecute:= bClose, tTimeout:= T#1S, bBusy=> , bError=> , nErrId=> );

2、测试

(1)网络调试助手创建服务端监听

(2)PLC端的Client连接服务端

PLC程序中输入IP地址和端口号进行连接,连接正常没有报错、服务端监测到PLC的连接。

 (3)PLC端给服务端发送数据

PLC程序中设置发送的字节数为9,只发送9个byte的数据。bSend上升沿信号触发有效。

 (4)服务端给PLC发送数据

设置最大接收的数据量100byte(根据实际需要可设置不同大小),服务端发送的时候数据量不要超过100byte。接收扫描实时间500ms(接收时间也可以调)

二、TwinCAT3以太网TCP/IP服务端创建

1、系统连接示意图

PLC作为服务端,创建Listen等待客户端连接,客户端连接后服务端再进行Accept接收请求。

2、程序创建

实验需要用到5个功能块,分别是FB_SocketListen,FB_ SocketAccept, FB_SocketSend,FB_SocketReceive,FB_SocketClose

(1)变量创建

PROGRAM SocketServer
VAR_FB_SocketListen:						FB_SocketListen;_FB_SocketAccept:						FB_SocketAccept;_FB_SocketSend:							FB_SocketSend;_FB_SocketReceive:						FB_SocketReceive;_FB_SocketClose:						FB_SocketClose;_hListen:								T_HSOCKET;						//Socket监听句柄_hSocket:								T_HSOCKET;						//Socket连接句柄_LocalIpAddress:						T_IPv4Addr:='192.168.1.31';		//要连接Socket Server的ip地址_LocalPort:								UDINT:=9977;bListen:								BOOL;bAccept:								BOOL;bSend:									BOOL;//bRecevie:								BOOL;bClose:									BOOL;nSendByteLength:						UDINT:=9;						//需要发送的字节数	//nReceiveByteLength:						UDINT:=20;arrSendData:							ARRAY[1..10]		OF			BYTE;arrrReceiveData:						ARRAY[1..100]		OF			BYTE;Timer1:									TON;Send_R_TRIG:							R_TRIG;END_VAR

(2)程序

arrSendData[1]	:=	16#11;
arrSendData[2]	:=	16#22;
arrSendData[3]	:=	16#33;
arrSendData[4]	:=	16#44;
arrSendData[5]	:=	16#55;
arrSendData[6]	:=	16#66;
arrSendData[7]	:=	16#77;
arrSendData[8]	:=	16#88;
arrSendData[9]	:=	16#99;
arrSendData[10]	:=	16#A0;//Server端-监听
_FB_SocketListen(sSrvNetId:= , sLocalHost:= _LocalIpAddress, nLocalPort:= _LocalPort, bExecute:= bListen, tTimeout:=T#1S , bBusy=> , bError=> , nErrId=> , hListener=> _hListen);//Server端-接受请求
_FB_SocketAccept(sSrvNetId:= , hListener:= _hListen, bExecute:= bAccept, tTimeout:= T#1S, bAccepted=> , bBusy=> , bError=> , nErrId=> , hSocket=> _hSocket);//Server端-发送
Send_R_TRIG(CLK:= bSend, Q=> );
_FB_SocketSend(sSrvNetId:= , hSocket:= _hSocket, cbLen:= nSendByteLength, pSrc:= ADR(arrSendData), bExecute:= Send_R_TRIG.Q, tTimeout:= T#1S, bBusy=> , bError=> , nErrId=> );	//Server端-接收
//500ms接收一次
Timer1(IN:= NOT timer1.q, PT:=T#500MS , Q=> , ET=> );	
_FB_SocketReceive(sSrvNetId:= , hSocket:= _hSocket, cbLen:= SIZEOF(arrrReceiveData), pDest:= ADR(arrrReceiveData), //bExecute:= bRecevie, bExecute:= bListen AND bAccept  AND Timer1.Q, tTimeout:= T#1S, bBusy=> , bError=> , nErrId=> , nRecBytes=> );	//Server端-Socket关闭
_FB_SocketClose(sSrvNetId:= , hSocket:= _hSocket, bExecute:= bClose, tTimeout:= T#1S, bBusy=> , bError=> , nErrId=> );

3、测试

(1)Listen、客户端连接

 (2)服务端中Accept接收请求

(3)服务端和客户端之间相互发送数据

三、工程下载连接

1、 TwinCAT3以太网TCP/IP客户端测试程序

TwinCAT3以太网通讯测试-Client.rar-嵌入式文档类资源-CSDN下载

2、 TwinCAT3以太网TCP/IP服务端测试程序

https://download.csdn.net/download/panjinliang066333/87421905


http://chatgpt.dhexx.cn/article/HWdFf4mn.shtml

相关文章

TwinCat3学习问题

1. 4115报错 运行①,重启电脑即可。 运行TwinCAT 3 出现 4132和4115 问题,如何解决? 2. TwinCat图标为棕色,切换到运行模式报错。 此电脑 - 右键【管理】 - 【服务和应用程序】 - 【服务】 - 启动【TC3 system service】 启动…

EtherCAT之TwinCAT3安装、使用

目录 一. 环境:Win10专业版(i7处理器,intel网卡)VS Community 2017TC3 二、开启虚拟化,关闭超频。 三、安装TC3.1 四、新建PLC项目 五、新建c项目 一. 环境:Win10专业版(i7处理器&#xff…

keil中获取系统时间

包含头文件:time.h 程序: 运行结果:

VB获取系统时间

所需函数: Now函数:返回系统当前日期和时间 Format函数:根据格式表达式格式化数据 要点: yyyy(year):代表年份 MM(month):代表月份 dd(day&…

UE4 获取系统时间方法

UMG界面搭建 由于虚幻到01分的时前面会把0省略掉所以这里做了个判断 效果展示

Android 获取系统时间

Android开发中经常需要我们获取系统时间,而获取系统时间大致可以用这两种方法解决 1)SimpleDateFormatDateSystem.currentTimeMillis() 其中currentTimeMillis是用来返回一个当前时间距离1970-01-01 00:00:00的毫秒数,之后用这个数值构造一…

calendar 获取系统时间

文章目录 1、简介2、文件结构3、功能代码4、log 打印 1、简介 使用calendar 来获取系统时间,或者设定的时区时间 2、文件结构 3、功能代码 package com.example.tssh.mytimetest;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; im…

微信小程序--获取系统时间

前言 在编写小程序代码的时候,很多时候,我们需要时间戳,也就是需要获取当前的系统时间。这里海轰总结了两种方法。 方法一 当只需要简单的获取年、月、日之类的时候,我们直接利用Date()函数就行 举例 var monthnew Date().get…

wincc获取系统时间

wincc获取系统时间 实现方式:注意事项: wincc获取系统时间有好多种方法,本文主要介绍的是通过 建立驱动程序System Info.chn,并 新建变量来获取系统时间 实现方式: 在变量管理中新建驱动程序。System Info.chn 在新…

codesys 获取系统时间

codesys 获取系统时间 添加获取时间库 添加库输入caa dtutil搜索库,选中双击添加 2.定义功能块,读取时间 PROGRAM PLC_PRG VAR//定义读取当前时间功能块ReadCurrentTime:dtu.GetDateAndTime;//系统当前时间,注意此时的时间为世界时间并非本…

C语言-获取系统时间

目录 1.静态打印系统时间 1.要了解的知识 1.1 time_t 类型 1.1.2struct tm 类型 1.1.3 time()函数 1.2显示系统时间函数 1.2.1 localtime()函数---显示当前时区的时间 1.2.2 ctime()函数---以特定方式显示当前时间信息 1.2.3 asctime()函数---将包含当前日期时间信息的tm*类型…

shell脚本函数返回数组

执行脚本(文件my.sh),输出结果

子函数返回数组(指针和结构体)

一般用void的话就是没有返回值和不需要返回值的了,如调用一个输出函数,这个函数就没必要返回了,事实上这个函数只管输出就好了,也没有什么值要返回的,另一种是用指针传址的时候,因为你传的是地址&#xff0…

c++函数返回数组类型

c函数返回数组类型 首先,C 不允许返回一个完整的数组作为函数的参数。但是,可以通过指定不带索引的数组名来返回一个指向数组的指针。C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 方法一:将返回值定义…

C++ 函数返回数组处理方法

最近在通过函数返回数组时踩到了一些坑,在此记录一下。 首先C函数的返回类型没有“数组”这一结构,因此一般情况下我们会采用指针去接受数组的首地址来进行返回。另外由于函数体内定义的变量均为局部变量,局部变量被存储在栈区会在函数调用完…

c++ 函数返回数组

以下转自:http://blog.csdn.net/lijiayu2015/article/details/52821562 C中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现。 不能直接返回函数中定义的数组,会被释放掉 float* add(a[3],b[3]…

C++如何让函数返回数组

C如何返回数组 1.前言指针与指针变量的区分背景 2.正文第一次(❌)第二次(✔)优化vector 方法 3.总结4.更新日志 1.前言 指针与指针变量的区分 int x5; &x //这是指针 变量x的地址叫做它的指针 int * tem…

函数的返回值——数组返回

在C语言中,首先来对函数的返回值来温习一下: 函数调用使主调函数得到一个确定的值,这就是函数的返回值。函数的返回值是通过return 语句获得的。 那我们来提一个这样的问题,如果是一个数组通过排序后,得到了一个新的…

深度学习环境搭建之三_离线安装无线网卡、DKMS

2020.12.08更新:最近又离线装了一次Ubuntu系统。这次离线安装DKMS会报错,没有gcc、make;网上看了一下,gcc离线安装很麻烦,总得来看,还是放弃离线安装Ubuntu吧,联网后安装难度下降99% 【上次难道…

解决一例Fedora 31安装NVIDIA官方驱动程序无法使用DKMS注册的问题

更新: If Not True Then False提供了一份Patch后的340.108版驱动,直接使用此版驱动安装包不会遇到DKMS报错,升级5.5内核时也没有问题,点击进入下载页面。 手头一台Dell D630的本本,虽然已经10年以上寿命,拿…