背景知识介绍

ADS通信协议介绍

所谓通信协议,就是通信双方约定的一种数据识别规范,例如,你讲汉语,我也讲汉语,那么我们之间沟通的“通信协议”就是汉语,汉语中的汉字,发音,语法结构等等你也清楚,我也清楚,所以我们可以正确了解对方的意思,类似于通信协议中规定的传输媒介,信号编码规范,数据帧各部分的含义一样,不用把它想得特别深奥,就是机器设备之间的“语言”。
ADS全称是Automation Device Specification(汉译:自动化设备规范),在倍福TwinCAT的设计理念中,每一个软件模块都视为一个“设备”,这些“设备”相互独立,彼此之间通过ADS通信协议交换数据,ADS是一个应用层的协议,它架构在TCP/IP协议之上(ADS负责应用层,TCP负责传输层,IP负责网络层,还有一个数据链路层),ADS协议由德国倍福开发,且作为对外开放的通信接口来方便用户访问TwinCAT系统中各个软件模块的参数(配置参数,过程参数,运动参数等等)
有关ADS更为详细的信息介绍可以参考倍福官方网站的介绍:
链接ADS introduction

基于VS2019的控制台上位机程序

定位官方库函数

注意,该程序使用了倍福官方提供的库函数,如果你是安装在C盘默认路径的话,那么官方的库函数在这个目录中

如果是基于X86的架构,那么使用include和lib文件夹中的内容即可,如果是基于X64的架构,那么lib就要用x64这个文件下的内容,这个配置会在VS2019的项目设置过程中用到,要留意一下。

建立工程


点击下一步,为了方便,直接使用默认的名称

点击创建,就建立起一个“HelloWorld”工程,要特别注意图中画红色框的部分,后续配置库函数要注意和这里匹配

右键项目名称,在弹出的右键菜单下选择属性,弹出如下对话框

在附加包含目录右侧的小箭头,选择<编辑…>,打开倍福官方库提供的头文件目录位置,注意图里最上面的配置也是Debug,平台也是Win32。

使用同样的方法配置链接器的选项

附件依赖项的配置方法如下

配置好以后保存一下工程,关闭VS2019,重新打开,以使配置生效。此时包含头文件后,进行一下编译,会提示编译已通过

若编译过程中提示未定义的标识符等错误,重点检查以上配置内容,配置好以后一定要保存后,再重新打开软件,导入刚才的工程,即可使配置内容生效。
将以下程序拷贝到main()主函数所在的文件中

#include <iostream>
#include<conio.h>
#include <stdio.h>
#include<Windows.h>
#include "TcAdsDef.h" //结构体和常量的声明
#include "TcAdsAPI.h" // ADS函数的声明
int main()
{long      nErr, nPort;     //定义端口变量AmsAddr   LocalAddr;                //定义上位机AMS地址变量PAmsAddr  LocalpAddr = &LocalAddr;   //定义上位机ADS端口地址变量(上位机用来进行ADS通信的端口)AmsAddr   Tc3Addr;               //定义安装有TwinCAT3的下位机AMS地址变量(由于是本机测试,上位机和下位机的AMS地址是一样的)PAmsAddr  Tc3pAddr = &Tc3Addr;   //定义下位机端口地址变量(这里是读取PLC程序中变量,所以该端口固定为851)unsigned long IndexGroup=0x4020;   //要读取的对象的索引编号unsigned long IndexOffset=0x5E010; // 要读取对象的偏移量编号unsigned long Length=1;            //要读取对象的大小,计量单位为bytebool Data;                         //该变量用来存放读上来的值,变量类型要和待读取的值匹配//建立接口通讯连接nPort = AdsPortOpen();      //打开ADS通讯端口nErr = AdsGetLocalAddress(LocalpAddr); //自动获取本地地址if (nErr) std::cerr << "Error: AdsGetLocalAddress: " << nErr << '\n';else{std::cout << "LocalAdsAddress is: " ;printf("%d.",LocalpAddr->netId.b[0]);printf("%d.", LocalpAddr->netId.b[1]);printf("%d.", LocalpAddr->netId.b[2]);printf("%d.", LocalpAddr->netId.b[3]);printf("%d.", LocalpAddr->netId.b[4]);printf("%d.", LocalpAddr->netId.b[5]);std::cout << std::endl;std::cout << "LocalAdsPort Assigned is:" << LocalpAddr->port << std::endl;}if (nPort == LocalpAddr->port){std::cout << "LocalAdsPort: " << nPort << " opened!" << std::endl;}else{std::cout << "LocalAdsPort open failed!" << std::endl;}Tc3pAddr = LocalpAddr; //上位机和下位机都是同一台电脑,故AMS地址是一样的Tc3pAddr->port = 851; //把下位机的TC3 PLC的通讯端口设为851,这是倍福官方规定的,固定为851,TC2中为801,增加几个PLC,就依次增加为852,853...std::cout << "TC3 PLC ADS Communication Port is:" << Tc3pAddr->port << std::endl;while (1){nErr = AdsSyncReadReq(Tc3pAddr, IndexGroup, IndexOffset, Length, &Data);if (nErr)std::cerr << "ReadFailed! The Error Code is: " << nErr << '\n';else{std::cout << "Operation Succeed!" << std::endl;std::cout << "The Value Read is:" << Data << std::endl;}Sleep(500);//每500ms刷新一次值}}

重新生成解决方案

此时按F5运行程序,会出现以下提示,能够正确读取本机的ADS的AmsNetID,以及本机分配到的ADS端口号(这个端口号是ADS router分配的)但是因为没有开启PLC,所以读不到PLC中变量的值。

接下来编写PLC部分的程序,关于PLC程序的编写,因为比较简单,这里不再赘述,编写一个bool量,该bool量每100ms反转一次值,点击激活按钮,将程序下载到PLC中

点击Login登入

点击scope,Target browser,从这里查看PLC中变量的ADS信息,如图中红色圈所示,这几个值要和程序中的变量对应上才可以正确读取。

点击Start(或者F5)运行PLC程序,可以观察到PLC中的变量开始每100ms变化一次

此时切回到上位机的程序中,按F5运行,可以看到已读取到PLC当中的变量,且该变量值在变化,因为我们的读取周期(500ms)和plc更新变量的周期(100ms)不一致,故存在“不同步”的情况。

对应的上位机工程文件包可从这里下载:
链接: 上位机工程文件
对应的下位机工程文件包可从这里下载:
链接: 下位机工程文件
TwinCAT3中工程文件的导入方法可参考下图所示

上位机使用C++通过ADS协议与倍福PLC通信例程-布尔变量的读取相关推荐

  1. 上位机使用C++通过ADS协议与倍福PLC通信例程-字符串变量读取

    前言 建议初学者先看这一章节内容,里面包括一些基础的环境配置和项目建立流程,以后开发项目这些流程是通用的,务必掌握并熟练. 链接: 上位机使用C++通过ADS协议与倍福PLC通信例程-布尔变量的读取 ...

  2. 倍福PLC和C#通过ADS通信传输Bool数组变量

    在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入bool类型数组变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C# ...

  3. 倍福PLC和C#通过ADS通信传输int类型变量

    在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入int类型变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C#和倍福 ...

  4. 倍福PLC和C#通过ADS通信传输bool类型变量

    在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入bool类型变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C#和倍 ...

  5. 倍福PLC的C++ ADS通讯定义数据类型时注意事项

    在C++程序与倍福PLC通过ADS通讯时,如果C++程序中定义的变量与PLC程序中相应变量定义的数据类型不对应时,可能会出现数据读取或者写入错误,以下为调试过程中容易出错的实践总结记录. 1.向PLC ...

  6. C# TCP/IP通讯协议的整理(三)附带——与倍福PLC通讯

    首先,需要一个和倍福PLC通讯的dll,一般厂家会提供 添加到引用后,直接创建通讯类 using System; using System.Collections.Generic; using Sys ...

  7. 上位机通过3E帧SLMP协议直接读写FX5U(不使用MX插件)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.了解SLMP协议? 二.编程步骤 1.PLC设置 2.代码编写 总结 前言 上位机跟三菱PLC通讯通常比较简单的方 ...

  8. pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例

    1.引言 组态软件作为一种通用软件,体系结构较为庞大.功能软件包多.价格也比较昂贵,而且对于一些复杂的业务逻辑或自定义的协议,实现起来比较麻烦.近几年,C#/.NET上位机开发应用越来越广泛,相对于传 ...

  9. 485通信原理_上位机开发之单片机通信实践

    经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是和单片机通信,通信原理都是一样的.PLC的本质就是单片机,在 ...

最新文章

  1. 轻松练:如何从900万张图片中对600类照片进行分类|技术头条
  2. Java基础与提高干货系列——Java反射机制
  3. 天猫上线“商家售后服务评价”功能,消费者体验将纳入商家考核指标
  4. 【初赛】概率与期望学习笔记
  5. UNIX网络编程——select函数的并发限制和 poll 函数应用举例
  6. 地摊叫卖、超市播音工具-简洁的文字转语音播音软件
  7. 【转】在Windows中搭建iPhone开发环境
  8. Apache多站点配置
  9. 虚拟机更新为阿里数据源
  10. hadoop(2.5) 分布式部署
  11. c语言串口接收的字符转int,从串口发送和接收int值
  12. 代理ip,代理服务器等相关
  13. 测试用例的设计方法:等价类划分法
  14. 爬虫小练习:堆糖图片抓取--爬虫正式学习day1
  15. python except exception_try except Exception 异常处理
  16. 开源3D激光SLAM项目BLAM
  17. ppt如何变成pdf
  18. 金立android 7.1.1,金立K30Pro正式上市:运行安卓7.1.1系统,699元起
  19. sqlzoo 答案全集
  20. 计算机硬件配置与bios设置,bios查看电脑配置 bios查看电脑的详细配置

热门文章

  1. Python数据分析 | (31) 透视表和交叉表
  2. python实现千牛客服自动回复语_千牛旺旺客服设置自动回复的技巧有哪些?总结性文章来啦...
  3. 个人逾期,失信黑名单
  4. phhphphphphphphp转自 细雪之舞 专注DEV
  5. 佑道医生集团获风和资本数千万A轮投资,6个月实现盈亏平衡
  6. 什么叫简正振动模式(即简正模)
  7. Python开发——函数【迭代器、生成器、三元表达式、列表解析】
  8. 作为Fab-Liter战略的一部份,安森美剥离晶圆制造厂
  9. python实现一个简单的广域网内的GUI聊天室
  10. YOLOV5源码解读(数据集加载和增强)