上位机使用C++通过ADS协议与倍福PLC通信例程-布尔变量的读取
背景知识介绍
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通信例程-布尔变量的读取相关推荐
- 上位机使用C++通过ADS协议与倍福PLC通信例程-字符串变量读取
前言 建议初学者先看这一章节内容,里面包括一些基础的环境配置和项目建立流程,以后开发项目这些流程是通用的,务必掌握并熟练. 链接: 上位机使用C++通过ADS协议与倍福PLC通信例程-布尔变量的读取 ...
- 倍福PLC和C#通过ADS通信传输Bool数组变量
在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入bool类型数组变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C# ...
- 倍福PLC和C#通过ADS通信传输int类型变量
在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入int类型变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C#和倍福 ...
- 倍福PLC和C#通过ADS通信传输bool类型变量
在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入bool类型变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C#和倍 ...
- 倍福PLC的C++ ADS通讯定义数据类型时注意事项
在C++程序与倍福PLC通过ADS通讯时,如果C++程序中定义的变量与PLC程序中相应变量定义的数据类型不对应时,可能会出现数据读取或者写入错误,以下为调试过程中容易出错的实践总结记录. 1.向PLC ...
- C# TCP/IP通讯协议的整理(三)附带——与倍福PLC通讯
首先,需要一个和倍福PLC通讯的dll,一般厂家会提供 添加到引用后,直接创建通讯类 using System; using System.Collections.Generic; using Sys ...
- 上位机通过3E帧SLMP协议直接读写FX5U(不使用MX插件)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.了解SLMP协议? 二.编程步骤 1.PLC设置 2.代码编写 总结 前言 上位机跟三菱PLC通讯通常比较简单的方 ...
- pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例
1.引言 组态软件作为一种通用软件,体系结构较为庞大.功能软件包多.价格也比较昂贵,而且对于一些复杂的业务逻辑或自定义的协议,实现起来比较麻烦.近几年,C#/.NET上位机开发应用越来越广泛,相对于传 ...
- 485通信原理_上位机开发之单片机通信实践
经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是和单片机通信,通信原理都是一样的.PLC的本质就是单片机,在 ...
最新文章
- 轻松练:如何从900万张图片中对600类照片进行分类|技术头条
- Java基础与提高干货系列——Java反射机制
- 天猫上线“商家售后服务评价”功能,消费者体验将纳入商家考核指标
- 【初赛】概率与期望学习笔记
- UNIX网络编程——select函数的并发限制和 poll 函数应用举例
- 地摊叫卖、超市播音工具-简洁的文字转语音播音软件
- 【转】在Windows中搭建iPhone开发环境
- Apache多站点配置
- 虚拟机更新为阿里数据源
- hadoop(2.5) 分布式部署
- c语言串口接收的字符转int,从串口发送和接收int值
- 代理ip,代理服务器等相关
- 测试用例的设计方法:等价类划分法
- 爬虫小练习:堆糖图片抓取--爬虫正式学习day1
- python except exception_try except Exception 异常处理
- 开源3D激光SLAM项目BLAM
- ppt如何变成pdf
- 金立android 7.1.1,金立K30Pro正式上市:运行安卓7.1.1系统,699元起
- sqlzoo 答案全集
- 计算机硬件配置与bios设置,bios查看电脑配置 bios查看电脑的详细配置
热门文章
- Python数据分析 | (31) 透视表和交叉表
- python实现千牛客服自动回复语_千牛旺旺客服设置自动回复的技巧有哪些?总结性文章来啦...
- 个人逾期,失信黑名单
- phhphphphphphphp转自 细雪之舞 专注DEV
- 佑道医生集团获风和资本数千万A轮投资,6个月实现盈亏平衡
- 什么叫简正振动模式(即简正模)
- Python开发——函数【迭代器、生成器、三元表达式、列表解析】
- 作为Fab-Liter战略的一部份,安森美剥离晶圆制造厂
- python实现一个简单的广域网内的GUI聊天室
- YOLOV5源码解读(数据集加载和增强)