win10系统下TwinCAT3与VS2019之间的ADS通信

article/2025/10/3 11:23:08

@WIN10, TwinCAT3, VS2019, ADS
转博后第一次出差,来到了UnitedImaging,这次的任务是负责在ros系统和TwinCAT3之间的 ADS 通信。
作为本次第一篇博客,先跑通win10系统下TwinCAT3与VS2019之间的ads通信。
本文在PLC中设置一个BOOL量,通过c++控制台来读取和写入该值,从而实现第一步的通信读写。

TwinCAT3 TcXaeShell程序编写

  1. 首先安装TwinCAT3 ,倍福的网站:

     https://tr.beckhoff.com.cn/course/view.php?id=136
    

这里面有完整的介绍。

  1. 选择一个简单的实例,这里我跑了一下倍福的教程通过c++程序读取/写入PLC程序中的布尔量,该任务实现分为两部分:1)在TwinCAT程序下编写PLC的程序;2)在vs2019下编写c++程序。

TwinCAT PLC 程序编写

首先进行PLC程序的编写,本节分为三部分1)如何新建一个项目;2)程序代码的介绍和编写;3)如何调试。

如何新建项目

1.新建project
打开下载好的TwinCAT3 TcXaeShell,点击文件->新建->项目,如下图所示,选择TwinCAT Projects下的TwinCAT XAE Project,设置好项目名称和路径,注意路径中不要出现中文
新建项目

添加新项

在项目中找到PLC,(如下图所示)右键添加新项,选择Standard PLC Project,命名成PLC_TEST1,点击添加,这样我们的项目就建好了。outline
在这里插入图片描述

  1. 编写第一个程序
    在左侧解决方案资源管理器中PLC->PLC_TEST1->PLC_TEST1 Project->POUs,里面已经有了主程序MIAN(PRG)
    双击点开可以发现有上下两块,分别代表变量声明区程序代码区

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

PROGRAM MAIN
VAR
BOOL1 AT %MD0 : BOOL;
END_VAR

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

;

在这里插入图片描述
3. 程序调试
在调试前先以管理员身份运行C:\TwinCAT\3.1\System下面的 win8settick.bat,上方有三个小图标,左边楼梯一样的代表激活,中间绿色方框代表run,右边蓝色代表退出run。
首先把鼠标选择到PLC_TEST1 Project右键点击生成,这样就Build了代码,然后点击楼梯一样的小图标activate项目,最后点击绿色图标程序就开始运行了。

在这里插入图片描述
然后点击登录到(这个绿色的箭头),表示你的程序接入了通信网络
在这里插入图片描述

在这里插入图片描述
到这里我们的PLC程序编写以及运行已经OK了,接下来就进行C++的编写。

Vs 2019程序环境配置

首先要保证TwinCAT3和Vs2019 同属于一个平台 x86或者x64,这里选择x64, 在给定的API里面有3个文件:TcAdsAPI.h,TcAdsDef.h和TcAdsDll.lib

  1. 配置环境
    包含目录:包含.h文件的路径
    库目录:包含.lib
    在这里插入图片描述链接器
    库目录:lib文件目录
    在这里插入图片描述
    输入:TcAdsDll.lib
    在这里插入图片描述
  2. 编写程序
    首先新建控制台项目,如下图所示,新建项目PLCConsole

在这里插入图片描述

  1. 编写程序
    主程序中输入如下代码

#include //标准的输入输出流头文件
#include <conio.h> //控制台输入输出头文件
#include <windows.h> //windowsAPI的函数声明和宏
#include “TcAdsDef.h” //结构体和常量的声明
#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;
}

  1. 编译程序并运行
    编译程序并运行,首先观察PLC程序中BOOL1的值是FALSE
    在这里插入图片描述
    运行PLCConsole,显示值为0,说明成果读取BOOL1的值是FALSE(也就是0)
    在这里插入图片描述

接下来在控制台中输入1并回车
在这里插入图片描述
这个时候已经把BOOL1的值写入给了PLC程序,进入PLC程序去看看吧~
在这里插入图片描述
果然被改成了TRUE,通信成功!


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

相关文章

TwinCAT概述

1.什么是TwinCAT&#xff1f; TwinCAT是Beckhoff公司的运动控制软件&#xff0c;全称是"The Windows Control and Automation Technology"&#xff0c;基于Windows操作系统。 2.TwinCAT的结构 TwinCAT包含三层结构&#xff1a;PLC轴、NC轴和物理轴。 PLC程序中定…

如何基于TwinCAT3实现伺服电机控制(一)

先说一下硬件&#xff0c;伺服电机采用定制的关节无框力矩电机&#xff0c;带力矩传感器&#xff0c;EtherCAT通讯&#xff0c;想用在康复机器人上做运动控制研究。 软件方面采用TwinCAT3&#xff0c;这个到倍福官网https://www.beckhoff.com.cn/zh-cn/上搜索下载即可&#xf…

TwinCAT3安装教程-EtherCAT学习

TwinCAT3安装教程-EtherCAT学习 情况简介 最近一些时间在研究TwinCAT,分别在笔记本和台式机上运行了TwinCAT3&#xff0c;在此将遇到的问题记录一下&#xff0c;希望能给大家一些帮助。 1、笔记本配置&#xff1a;windows 64位 Qualcomm Atheros AR8171/8175/PCI-E gIGABIT E…

TwinCAT 3 基础——编程基础

文章目录 1、注释2、数据类型3、基本数据类型变量声明方式4、数组5、实际输入输出变量6、常量7、结构体数据8、枚举变量9、条件选择10、循环语句 1、注释 注释是由 “&#xff08;* ” 开始&#xff0c;由 “ *&#xff09;”结束。可以放在行首&#xff0c;行尾&#xff0c;也…

TwinCAT3常见问题1

TwinCAT 3 为工程技术开辟了一条新的道路&#xff0c;并通过添加很多功能对实时内核进行扩展。工程环境完全集成在微软的Visual Studio框架中&#xff0c;除了系统配置、运动控制、I/O和IEC61131 PLC编程语言之外&#xff0c;还可以进行编程和调试。本文针对TwinCAT3VS2017使用…

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

目录 一、TwinCAT3以太网TCP/IP客户端创建 1、系统连接示意图 1、程序创建 (1)工程创建和授权添加 (2)库文件添加 &#xff08;3&#xff09;变量创建 &#xff08;4&#xff09;程序 2、测试 &#xff08;1&#xff09;网络调试助手创建服务端监听 &#xff08;2&…

TwinCat3学习问题

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

EtherCAT之TwinCAT3安装、使用

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

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;将返回值定义…