EtherCAT之TwinCAT3安装、使用

article/2025/10/3 13:39:24

目录

一. 环境:Win10专业版(i7处理器,intel网卡)+VS Community 2017+TC3

二、开启虚拟化,关闭超频。

三、安装TC3.1

四、新建PLC项目

五、新建c++项目


一. 环境:Win10专业版(i7处理器,intel网卡)+VS Community 2017+TC3

备注:如果在虚拟机中安装,参考官方文档《TwinCAT3软件版本管理指南》2.2.1 通过虚拟机管理开发环境

备注:在TC中开发c++程序模块,需要添加网卡适配器驱动,以及windows的sdk/安装证书,操作过程需要参考官方文档《TwinCAT3 C++/Simulink教程》

备注:官方文档非常丰富,强烈建议学习。倍福虚拟学院: 课程类别 (beckhoff.com.cn)

刚接触TwinCAT3的小伙伴多多看看视频课程以及文档资料!!!

  • 安装VS2017

正常安装即可。

备注1:旧的TC3.1支持Win10和VS2015,如果安装的是2017及以上版本,则安装TC3.1时会集成VS2013shell,此环境无法开发c++和matlab程序,但是能够运行这些程序。

备注2:安装顺序:安装VS->安装TC;卸载顺序:卸载TC->卸载VS

备注3: 最新的TC3下载地址,最高支持VS2019。 Software | 倍福 中国

备注4:本文介绍了TwinCAT的安装、简单使用、PLC以及与c++程序的ads通讯。参考了倍福虚拟学院的官方文档,大家可以在倍福虚拟学院中找到。

二、开启虚拟化,关闭超频。

在安装之前要配置一下主板的BIOS: 关闭 Hyper-Threading 的功能打开 Intel VirtualizationTechnology Extensions (VT-x)功能 ,这个主要是因为关系到TC3在wind下实现实时内核的问题

三、安装TC3.1

1.双击打开TC31-Full….exe文件

2.等待,然后点击next

3.许可协议点击accept,点击next

4.点击next

5. 点击next

        我的电脑系统中已经装了vs2015,所以会显示下图。因为我TC3属于旧版本,暂时不支持vs2017及以上版本,如果vs版本再高,旧版本的TC3就只能集成一个vs2013的内核。最新的版本可以安装vs2017/vs2019。

勾选2015,next

6.点击Install,开始安装

安装过程,需要等待时间较久:

选择“安装”

7.点击Finish

8.点击Yes,重启电脑

9.完成重启后,开机进入桌面后,会自动出现TC的画面,然后消失,这是正常开机自启动画面。桌面右下角会出现TC的图标。

单击打开选项,选择如下图,打开TC界面。

10.界面如下

备注:TC的实际界面其实就是VS的界面,安装TC相当于给VS加个插件。

四、新建PLC项目

备注:下面的步骤都是基于“本地连接”,没有单独的主机、从机,即在同一台pc机上实现TC的plc程序和VS的c++程序通信(ads通信)

1. 依次选择FILE->NEW->Project

2.按照下图依次点击

3.试用版授权激活

在不连接网络的情况下,可以根据实际需求重复激活使用。TwinCAT3 开发环境可以自动检测项目中所需要的授权,并且在运行项目的时候进行提示,比如当项目在本地或者目标控制器中被激活的时候,会提示那些试用版授权应该被激活。具体步骤如下:

  1. 点开 SYSTEM 下的 License

备注:下图是已经激活后的图

(2)在菜单中有 4 个选项

Order Information(Runtime):试用版和正版激活选项

Manager Licenses:可以手动勾选所需要的 licenses

Project Licenses:当前项目所用到的 licenses

Online Licenses:激活过的 licenses 或者曾经激活过的 licenses

(3)首先选择 Manager Licenses,在 Add License 中勾选所需要的 License

(4)之后回到 Order information 选型,点击 Activate 7 Days Trial License,随后会

弹出验证码方框,输入 5 位验证码,大小写有区分

备注:手动输入,复制粘贴无效

(5)输入正确后点击 OK 会弹出窗口告知 7 天的试用版 license 已经生成,这样

我们就可以有 7 天的授权可以用,如果过期了再次用同样的方法激活就可以了

4.新建PLC测试程序

  1. 项目文件夹下找到,右键选择添加新项

(2)选择 Standard PLC Project,并把名称改成英文,例如下图中的‘test’

(3)找到主程序MIAN(PRG)

双击点开可以发现有上下两块,分别代表变量声明区和程序代码区

在变量声明区(上面的区域)定义一个名称为BOOL1的BOOL型变量,并赋予其地址“AT %MD0”

在程序代码区中输入一个“;”(相当于return)

备注:%MD0是双字节地址,声明布尔量是用%MX0.0比较好

(4)程序写好后右键 xxxx Project,选择 Build

(5)编译结果如下,主要看Output中的结果,是否是成功

(6)如果(8)步执行不了,请先执行(6)、(7)步。

在TwinCAT安装目录下找到win8settick.bat文件,右键选择管理员方式运行,可能会弹出命令窗口,也可能窗口闪退,不用管,然后重启。

(7)桌面右下角将System切换到Start模式,类似PLC的RUN模式。(默认是Config模式)

(8)激活配置,弹出的窗口点确定、确定。

软件右下角出现绿色动态图标,代表正常。

(9)点击Login

如果端口没有应用,则会弹出创建窗口,确认即可。

五、新建c++项目

这里的c++程序和TwinCAT3中的通讯是ADS通讯

1.创建c++控制台项目,正常创建即可。

2.右键项目文件夹名,选择属性,打开配置窗口。

3.配置属性→链接器→常规→附加库目录→输入目录名称(C:\TwinCAT\AdsApi\TcAdsDll\x64\lib,这是安装Twincat的通讯库函数的默认路径)。(根据实际需要选择x64,x86则去掉 \x64 )

4. 再依次添加:链接器→输入→附加依赖项,输入文件名“TcAdsDll.lib”,点击确定。

5. 还需要将头文件进行声明,将C:\TwinCAT\AdsApi\TcAdsDll\Include目录下的 "TcAdsDef.h"和 "TcAdsAPI.h" 先后声明在头文件中(先声明TcAdsDef.h文件,不然编译报错)。程序代码如下。

#include <iostream>//标准的输入输出流头文件#include <conio.h> //控制台输入输出头文件#include <windows.h> //windowsAPI的函数声明和宏#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsDef.h" //结构体和常量的声明#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h" // ADS函数的声明#include <conio.h>#include <stdio.h>using namespace std;int main(){long nErr, nPort; //定义端口变量AmsAddr Addr; //定义AMS地址变量PAmsAddr pAddr = &Addr; //定义端口地址变量bool BOOL1; //定义布尔量nPort = AdsPortOpen(); //打开ADS通讯端口nErr = AdsGetLocalAddress(pAddr); //得到本地端口地址if (nErr) std::cerr << "Error: AdsGetLocalAddress: " << nErr << '\n'; //检查获取地址的操作是否执行成功pAddr->port = 851; //将指针指向851端口do{//向PLC中读取BOOL量nErr = AdsSyncReadReq(pAddr, 0x4020, 0x0, 0x1, &BOOL1); //从ADS服务器同步读取数据,pAddr:ADS设备的地址,0x4020:段地址,0x0偏移地址,0x1:数据长度,@BOOL1:接收数据的缓存if (nErr) std::cerr << "Error: AdsSyncReadReq: " << nErr << '\n'; //检查获取地址的操作是否执行成功cout << BOOL1 << '\n'; //输出”BOOL1”的值//在控制台上输出BOOL:cin >> BOOL1; //为BOOL1赋值nErr = AdsSyncWriteReq(pAddr, 0x4020, 0x0, 0x1, &BOOL1); //同步写数据到ADS设备,pAddr:ADS设备的地址,0x4020:段地址,0x0偏移地址,0x1:数据长度,@BOOL1:接收数据的缓存if (nErr) cerr << "Error: AdsSyncWriteReq: " << nErr << '\n'; //检查获取地址的操作是否执行成功} while (_getch() == '\r'); //用do-while语句来实现循环读取nErr = AdsPortClose(); //关闭ADS通讯端口if (nErr) std::cerr << "Error: AdsPortClose: " << nErr << '\n'; //检查关闭通讯端口的操作是否执行成功return 1;}

6.调试

控制台输出0,表示通信成功,并读取到plc中的bool变量;

向控制台输入1,可以观察到plc中的bool变量的值变成true。


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

相关文章

keil中获取系统时间

包含头文件&#xff1a;time.h 程序&#xff1a; 运行结果&#xff1a;

VB获取系统时间

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

UE4 获取系统时间方法

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

Android 获取系统时间

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

calendar 获取系统时间

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

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

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

wincc获取系统时间

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

codesys 获取系统时间

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

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脚本函数返回数组

执行脚本&#xff08;文件my.sh&#xff09;&#xff0c;输出结果

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

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

c++函数返回数组类型

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

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

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

c++ 函数返回数组

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

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

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

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

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

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

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

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

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

DKMS:Dynamic Kernel Module Support

DKMS简介 DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。 1.背景 对于没有内核编程经验的使用者来说&#xff0c;使用者可能经常困惑&#xff1a;为什么更新操作系统之后&#xff0c;原来用的好好的…

DKMS(大开门是什么意思)

ZS,DZ,DKMS玩了很久了,RAIDJJC也玩了不少了&#xff0c;现 盗贼刚刚又被加强了.其实无论什么职业竞争,都是靠人脉和职业本身无关,刚开TBC的时候DZ下副本没人要.我们亲友团的DZ跟我们一路走来,一个副本也没拉下.所以固定亲友团才是王道.选择自己喜欢的职业,别光顾着好拿装备. 商…