在qt中使用c++實現與Twincat3 PLC變量通信

這是一個只針對新手的教程,下載安裝就不說了,我下的是TC31-Full-Setup.3.1.4024.66.exe是這個版本,其他版本應該問題不大。

先創建一個項目

選中SYSTEM,在右側點擊Choose Target(接下來界面跟我不一樣沒關系,因為是從已有的項目上截的圖,像plc可能你們沒有文件,后面會講),選擇Search,進去再選擇Broadcast Search,選擇你要的那個,你們可能沒有那個“x”,“x”代表連接成功,接下來點擊Add Route,取消勾選Secure ADS(本次用不到),輸入密碼(查了下,默認密碼應該是1或者沒有),點擊ok,接下來應該就有“x”了,代表連接成功了,點擊close,記住你設備對應地址,接下來在c++會用到,點擊ok(說一下跳出什么提示都點是,后面也是)。

接下來編寫pcl代碼,右鍵PLC添加新項,選擇Standard PLC Project,點擊添加,這樣plc下就會出來一堆文件,找到POUS文件,點擊里面的MAIN,這樣就可以編寫plc程序了。

我這邊定義了a,b,c,sum如圖所示(我也是第一次寫plc程序,稍微查了一下,這邊上下兩部分,上面是初始化變量區域,下面是邏輯運算區域),自己寫入a,b,c的值,最后相加得到sum,右鍵點擊你的plc文件名,再點擊生成,編譯完之后點擊上方activate configuration,跳出提示框一直點ok/是,進入run mode,這里應該能看見你設備上的TC燈變成綠色,這樣Twincat端的基本已經完成,現在寫c++程序。

我這邊使用qt編寫c++程序(其他應該也可以),先創建一個c++程序,在.pro中添加ads的庫與頭文件的路徑,路徑按自己實際情況改。添加頭文件#include <windows.h>,#include <TcAdsDef.h>
#include <TcAdsAPI.h>,嚴格根據這個順序來,不然可能會報錯,定義端口變量,AMS地址變量,端口地址變量,以及對應的用來接收你在pcl中定義變量的值的變量(這里我用short定義是因為pcl中int只有2字節,為了對應,c++中使用short定義),使用AdsPortOpen()函數打開ads端口通信,設置端口為851(默認端口),手動填寫目標設備的AMSNETID,即上面讓你們記得的那個地址(這里手動填寫是因為我不知道啥原因自動填寫有問題,感興趣可以試試,就我注釋掉那一部分)。

TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
? ? ? ? main.cpp


INCLUDEPATH += $$quote(C:/TwinCAT/AdsApi/TcAdsDll/Include)

LIBS += $$quote(C:/TwinCAT/AdsApi/TcAdsDll/x64/lib/TcAdsDll.lib)

?

? ? long ? ? ? ?nErr, nPort;//定義端口變量
? ? AmsAddr ? ? Addr;//定義AMS地址變量
? ? PAmsAddr ? ?pAddr = &Addr;//定義端口地址變量
? ? short ? ? ? a,b,c;
? ? short ? ? ? sum;

? ? nPort = AdsPortOpen();//打開ADS通訊端口
? ? // nErr = AdsGetLocalAddress(pAddr);
? ? // if (nErr) cerr << "Error:AdsGetLocalAddress:" << nErr << '\n';
? ? pAddr->port = 851;//TC3通訊使用的為851端口
? ? pAddr->netId.b[0] = 169; //手動填寫目標設備的AMSNETID
? ? pAddr->netId.b[1] = 254;
? ? pAddr->netId.b[2] = 100;
? ? pAddr->netId.b[3] = 116;
? ? pAddr->netId.b[4] = 1;
? ? pAddr->netId.b[5] = 1;

通過AdsSyncWriteReq?函數,自行寫入a,b,c的值,在Twincat中按下ctrl+q進入查找功能,輸入browser,選擇第一個就可以跳到Target Browser界面,可以查看變量的段地址和偏移地址,按圖中寫入代碼,循環讀取a,b,c,sum的值(看自己要求要不要循環讀取),最后記得用AdsPortClose()函數關閉ads通信端口。

    //寫入a的值cout << "a = ";cin >> a;nErr = AdsSyncWriteReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//寫入b的值cout << "b = ";cin >> b;nErr = AdsSyncWriteReq(pAddr,0x4020,0x10,0x2,&b);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//寫入c的值cout << "c = ";cin >> c;nErr = AdsSyncWriteReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';

do{//讀取a的值nErr = AdsSyncReadReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << a << endl;//讀取b的值nErr = AdsSyncReadReq(pAddr,0x4020,0x10,0x2, &b);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << b << endl;//讀取c的值nErr = AdsSyncReadReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << c << endl;//讀取sum的值nErr = AdsSyncReadReq(pAddr,0x4020,0x20,0x2,&sum);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << "sum = " << sum << '\n';cout << "--------------" << endl;cout << endl;Sleep(200);}while(1);

????nErr = AdsPortClose();
? ? if (nErr) cerr << "Error:AdsPortClose:" << nErr << '\n';

?回到plc端點擊loin按鈕,我是直接運行的,有些版本可能還要點在一下三角圖案來運行,運行之后會自動跳出一個MAIN[Online]界面,可以看到初始值都為0,在qt中勾選上在終端中運行,接下來運行c++程序,可以看到我給a,b,c分別賦值1,2,3,最終得到sum為6,同時Twincat中的a,b,c,sum也跟著變化了(其實如果只有讀取可以不按login也能成功,但如果你要寫入一定要點login才能成功改變值)。

這是全部的源代碼

#include <iostream>
//#include <conio.h>
#include <windows.h>
#include <TcAdsDef.h>
#include <TcAdsAPI.h>using namespace std;int main()
{long        nErr, nPort;//定義端口變量AmsAddr     Addr;//定義AMS地址變量PAmsAddr    pAddr = &Addr;//定義端口地址變量short       a,b,c;short       sum;nPort = AdsPortOpen();//打開ADS通訊端口// nErr = AdsGetLocalAddress(pAddr);// if (nErr) cerr << "Error:AdsGetLocalAddress:" << nErr << '\n';pAddr->port = 851;//TC3通訊使用的為851端口pAddr->netId.b[0] = 169; //手動填寫目標設備的AMSNETIDpAddr->netId.b[1] = 254;pAddr->netId.b[2] = 100;pAddr->netId.b[3] = 116;pAddr->netId.b[4] = 1;pAddr->netId.b[5] = 1;//寫入a的值cout << "a = ";cin >> a;nErr = AdsSyncWriteReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//寫入b的值cout << "b = ";cin >> b;nErr = AdsSyncWriteReq(pAddr,0x4020,0x10,0x2,&b);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';//寫入c的值cout << "c = ";cin >> c;nErr = AdsSyncWriteReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncWriteReq:" << nErr << '\n';do{//讀取a的值nErr = AdsSyncReadReq(pAddr,0x4020,0x8,0x2,&a);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << a << endl;//讀取b的值nErr = AdsSyncReadReq(pAddr,0x4020,0x10,0x2, &b);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << b << endl;//讀取c的值nErr = AdsSyncReadReq(pAddr,0x4020,0x18,0x2,&c);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << c << endl;//讀取sum的值nErr = AdsSyncReadReq(pAddr,0x4020,0x20,0x2,&sum);if (nErr) cerr << "Error : AdsSyncReadReq:" << nErr << '\n';cout << "sum = " << sum << '\n';cout << "--------------" << endl;cout << endl;Sleep(200);}while(1);nErr = AdsPortClose();if (nErr) cerr << "Error:AdsPortClose:" << nErr << '\n';
}

?

以上就是在qt中使用c++實現與Twincat3 PLC變量通信全過程,本人也是第一次接觸也是摸索了很久,希望能幫到大家。
如果要長時間接觸倍福可以虛擬倍福學園自己學習一下https://tr.beckhoff.com.cn/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81810.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云原生微服務devops項目管理英文表述詳解

文章目錄 1.云原生CNCF trail map云原生技術棧路線圖 2. 微服務單體應用與微服務應用架構區別GraphQLKey differences: GraphQL and REST 3.容器化&編排dockerKubernetesContainers and ContainerizationContainer Basics 4. DevOps & CI/CDTerms and Definitions 5.Ag…

pyside 使用pyinstaller導出exe(含ui文件)

第一步&#xff1a;首先確保安裝好pyinstall&#xff0c;終端運行 pyinstaller -w main.py 生成兩個文件夾 打開exe文件報錯&#xff0c;問題是ui文件找不到 第二步&#xff1a;將ui文件復制到exe所在文件夾&#xff0c;打開成功 ![在這里插入圖片描述](https://i-blog.csdni…

kerberos在無痕瀏覽器 獲取用戶信息失敗 如何判斷是否無痕瀏覽器

kerberos在無痕瀏覽器 獲取用戶信息失敗 如何判斷是否無痕瀏覽器 js 代碼 其他地方用直接導入js getCurrentUserId 這是自己后端獲取 域賬號地址 我是成功返回200 //true普通瀏覽器 fasle 無痕瀏覽器 export const checkBrowserMode async () > {try {const response a…

HTML 計算網頁的PPI

HTML 計算網頁的PPI vscode上安裝live server插件&#xff0c;可以實時看網頁預覽 有個疑問&#xff1a; 鴻蒙density是按照類別寫死的嗎&#xff0c;手機520dpi 折疊屏426dpi 平板360dpi <html lang"en" data - overlayscrollbars - initialize><header&…

華為OD機試真題——Boss的收入(分銷網絡提成計算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

<el-date-picker>組件傳參時,選中時間和傳參偏差8小時

遇到一個bug&#xff0c;不仔細看&#xff0c;都不一定能發現&#xff0c;bug描述&#xff1a;我們有一個搜索框&#xff0c;里面有一個時間選擇器&#xff0c;當我使用<el-date-picker>時&#xff0c;我發現當我選擇時分秒之后&#xff0c;顯示都正常&#xff0c;但是當…

uni-app開發特殊社交APP

uni-app開發特殊社交APP 目錄 1.展示APP功能 2.展示項目結構 3.關于我的GitHub 引言 博主最近自己在GitHub上面上傳了一個關于社交軟件的項目&#xff08;該項目早已開發完畢&#xff09;, 這個社交軟件比較特殊, 被稱之為blind-date&#xff0c; blind-date 是基于 uni-…

深入研究Azure 容器網絡接口 (CNI) overlay

啟用cni overlay 在通過portal創建aks的時候,在networking配置上,選中下面的選項即可啟用。 通過CLI創建AKS 要創建具有 CNI 覆蓋網絡的 AKS 群集,需要在創建群集時指定 --network-plugin azure 和 --network-plugin-mode 覆蓋選項。 還需要指定 --pod-cidr 選項來定義群…

Docker 部署項目

使用 Docker 部署項目是一個很好的選擇&#xff0c;可以避免服務器環境不兼容的問題&#xff0c;并且能夠實現一致性和可移植性。我會給你一個詳細的步驟&#xff0c;幫你從零開始理解 Docker&#xff0c;最終在服務器上部署 Roop 項目。 1. 安裝 Docker 首先&#xff0c;你需…

excel表格記賬 : 操作單元格進行加減乘除 | Excel中Evaluate函數

文章目錄 引用I 基礎求和∑II Excel中Evaluate函數基于字符串表達式進行計算用法案例 :基于Evaluate實現匯率計算利潤知識擴展在單元格內的換行選擇整列單元格引用 需求: 基于匯率計算利潤,調整金額以及進匯率和出匯率自動算出利潤,已經統計總利潤。 基于Evaluate實現匯率計…

vue+ts+TinyEditor 是基于 Quill 2.0 開發的富文本編輯器,提供豐富的擴展功能,適用于現代 Web 開發的完整安裝使用教程

簡介 TinyEditor 是基于 Quill 2.0 開發的富文本編輯器&#xff0c;提供豐富的擴展功能&#xff0c;適用于現代 Web 開發。具備模塊化設計、輕量級架構和高度可定制化特性&#xff0c;支持多種插件擴展&#xff0c;滿足不同場景需求。 核心特性 基于 Quill 2.0 的現代化架構模…

matlab實現激光腔長計算滿足熱透鏡效應

激光腔長計算與熱透鏡效應補償 在全固態激光器中&#xff0c;熱透鏡效應是一個重要的問題&#xff0c;因為它會影響激光的光束質量和輸出功率。以下是如何計算激光腔長并考慮熱透鏡效應的方法&#xff0c;以及一些補償技術。 1. 激光腔長計算 激光腔長的計算需要考慮激光晶體…

Science Robotics 具身智能驅動的空中物理交互新范式:結合形態和傳感,與非結構化環境進行穩健交互

隨著科技的飛速發展&#xff0c;無人機技術已從單純的遠程感知擴展到與環境的物理交互領域&#xff0c;為可持續發展目標的實現提供了新的可能性。傳統的空中物理交互方法依賴于復雜的控制策略和精確的環境建模&#xff0c;盡管能夠實現高精度操作&#xff0c;但其在非結構化自…

圖神經網絡在信息檢索重排序中的應用:原理、架構與Python代碼解析

現代信息檢索系統和搜索引擎普遍采用兩階段檢索架構&#xff0c;在人工智能應用中也被稱為檢索增強生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;。在初始檢索階段&#xff0c;系統采用高效的檢索方法&#xff0c;包括詞匯檢索算法&#xff08;如BM25&…

List 源碼翻譯

List 源碼翻譯-jdk1.8 翻譯來自 AI 大模型。 全部源碼翻譯下載 /** 版權所有 (c) 1997, 2014, Oracle 和/或其附屬公司。保留所有權利。* ORACLE 專有/機密。使用受許可條款約束。*********************/package java.util;import java.util.function.UnaryOperator;/*** 有序…

Vscode 解決 #include <> 找不到的問題

本人遇到的情況, 使用 ROS 的過程中, 發現 #include <pcl/point_types.h> 不被 VScode 識別, 在 AI 的幫助下解決了該問題, 現總結如下: 1. 查看是否有相應的文件 Linux 下, point_types.h 的存儲路徑一般為: /usr/include/pcl-1.x (我的路徑是 /usr/include/pcl-1.12)…

霹靂吧啦Wz_深度學習-圖像分類篇章_1.1 卷積神經網絡基礎_筆記

深度學習-圖像分類篇章 參考筆記 卷積神經網絡 英文&#xff1a;Convolutional Neural Network&#xff0c;CNN雛形&#xff1a;1998年LeCun的LeNet5&#xff0c;第一個卷積神經網絡包含&#xff1a; 卷積層&#xff1a;Convolutions下采樣層&#xff1a;Subsampling全連階層…

基于多模態腦電、音頻與視覺信號的情感識別算法【Nature核心期刊,EAV:EEG-音頻-視頻數據集】

簡述 理解情感狀態對于開發下一代人機交互界面至關重要。社交互動中的人類行為會引發受感知輸入影響的心理生理過程。因此&#xff0c;探索大腦功能與人類行為的努力或將推動具有類人特質人工智能模型的發展。這里原作者推出一個多模態情感數據集&#xff0c;包含42名參與者的3…

理解并解決高丟包率問題,構建清晰流暢的實時音視頻通話

丟包作為數字通信中的重要干擾因素&#xff0c;常常潛伏在表面之下&#xff0c;卻嚴重影響性能&#xff0c;將清晰的對話變的模糊不清&#xff0c;將連貫的演示變的斷斷續續。因此&#xff0c;對音視頻通話相關應用的開發者來說&#xff0c;理解丟包率非常重要。 什么是丟包&am…