目录

一. 环境: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。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐