Eip開源主站EIPScanner在Linux上的調試記錄(二 多生產者連接)

目錄

一、背景

二、可行性驗證

三、開發調試


一、背景

在一般場景下,只需一路IO連接,但稍微復雜的場景,就需要不同通訊周期的連接,這就需要有多組IO連接。

而大于一組的連接調試方法是一樣的,因此主要解決2組連接的代碼開發。

二、可行性驗證

在Eip Scanner Demo(主站)、PLC(從站)軟件上分別配置兩個生產者連接,驗證其數據收發可行性及穩定性。得到視頻及報文如下:

1、Enip

2、ForwardOpen 1

3、ForwardOpen 2

4、ForwardCloes 2

5、ForwardCloes 1

可見,進行了兩次ForwardOpen,建立了兩個生產者連接。

由上文可見,兩個生產者連接的ForwardOpen的不同點在于:

1、Connection Path 由PLC自動生成,直接配置到Ubuntu中

2、Connecte Serial Number 自由選擇,只要是兩個連接不同即可,見協議原文

3、Connection Parameter (可選,如果兩個收發字節數相同,則此項也相同)

因此,便可滿足上述要求情況下,將多生產者連接集成到一個SDK中。

但需要注意多線程下的單一物理網口的數據搶占問題。

三、開發調試

發現在_connectionMap中管理了所有的IO連接。

在forwardopen階段注冊_connectionMap,每開一個IO連接都會注冊一個_connectionMap進去

在handleConnections中,若IO連接不存在,則刪除掉

而在代碼中,無需在兩個連接的情況下守護兩個connectionManager,于是更改代碼如下:

int main() {。。。。parameters.o2tRealTimeFormat = true;parameters.t2oRealTimeFormat = true;parameters.originatorVendorId = 0xaa;parameters.connectionTimeoutMultiplier=2;parameters.priorityTimeTick=10;parameters.t2oNetworkConnectionParams |= NetworkConnectionParams::P2P;parameters.t2oNetworkConnectionParams |= NetworkConnectionParams::SCHEDULED_PRIORITY;parameters.t2oNetworkConnectionParams |= 0; //size of Assm100 =1parameters.o2tNetworkConnectionParams |= NetworkConnectionParams::P2P;parameters.o2tNetworkConnectionParams |= NetworkConnectionParams::SCHEDULED_PRIORITY;parameters.o2tNetworkConnectionParams |= 4; //size of Assm100 =1parameters.originatorSerialNumber = 0x012345;parameters.o2tRPI = 50000;parameters.t2oRPI = 50000;//50msparameters.transportTypeTrigger |= NetworkConnectionParams::CLASS1;parameters.transportTypeTrigger |= NetworkConnectionParams::TRIG_CYCLIC;  std::chrono::milliseconds timeout(5000);
//connect oneauto si_1 = std::make_shared<SessionInfo>("192.168.2.88", 0xAF12,timeout,50000);ConnectionManager connectionManager_1;parameters.connectionPath = {0x20, 0x04,0x24, 0x01, 0x2C, 0x65, 0x2C, 0xFF}; parameters.connectionSerialNumber = 0xbebc;auto io_1 = connectionManager_1.forwardOpen(si_1, parameters);if (auto ptr = io_1.lock()) {ptr->setDataToSend(std::vector<uint8_t>(4));ptr->setReceiveDataListener([](auto realTimeHeader, auto sequence, auto data) {std::ostringstream ss;ss << "secNum=" << sequence << " data=";for (auto &byte : data) {ss << "[" << std::hex << (int) byte << "]";}Logger(LogLevel::INFO) << "Received: " << ss.str();});ptr->setCloseListener([]() {Logger(LogLevel::INFO) << "Closed";});}//connect twoauto si_2 = std::make_shared<SessionInfo>("192.168.2.88", 0xAF12,timeout,50050);//ConnectionManager connectionManager_2;parameters.connectionPath = {0x20, 0x04,0x24, 0x01, 0x2C, 0x64, 0x2C, 0x6E}; parameters.connectionSerialNumber = 0x275D;//auto io_2 = connectionManager_2.forwardOpen(si_2, parameters);auto io_2 = connectionManager_1.forwardOpen(si_2, parameters);if (auto ptr = io_2.lock()) {ptr->setDataToSend(std::vector<uint8_t>(4));ptr->setReceiveDataListener([](auto realTimeHeader, auto sequence, auto data) {std::ostringstream ss;ss << "secNum=" << sequence << " data=";for (auto &byte : data) {ss << "[" << std::hex << (int) byte << "]";}Logger(LogLevel::INFO) << "Received: " << ss.str();});ptr->setCloseListener([]() {Logger(LogLevel::INFO) << "Closed";});}//handle connectwhile (connectionManager_1.hasOpenConnections()) {connectionManager_1.handleConnections(std::chrono::milliseconds(50));// connectionManager_2.handleConnections(std::chrono::milliseconds(50));}connectionManager_1.forwardClose(si_1, io_1);connectionManager_1.forwardClose(si_2, io_2);。。。。return EXIT_SUCCESS;
}

顯示Log如下,能正常維持兩個連接

wireshark報文如下:

此系列的b站視頻見:

基于EIPScanner的Linux Ethernet/IP的多生產者連接及Tag讀寫實現分享(一 引言)_嗶哩嗶哩_bilibili

參考代碼見:

咸魚ID:tb764914262

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

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

相關文章

Oracle APEX 利用卡片實現翻轉(方法二)

目錄 0. 以 Oracle 的標準示例表 EMP 為例&#xff0c;實現卡片翻轉 1. 創建卡片區域 (Cards Region) 2. 定義卡片的 HTML 結構 3. 添加 CSS 實現樣式和翻轉動畫 4. 創建動態操作觸發翻轉 5. 運行效果 0. 以 Oracle 的標準示例表 EMP 為例&#xff0c;實現卡片翻轉 目標如…

低代碼拖拽實現與bpmn-js詳解

低代碼平臺中的可視化拖拽功能是其核心魅力所在&#xff0c;它讓構建應用變得像搭積木一樣直觀。下面我將為你梳理其實現原理&#xff0c;并詳細介紹 vue-draggable 這個常用工具。 &#x1f9f1; 一、核心架構&#xff1a;三大區域與數據驅動 低代碼編輯器界面通常分為三個核心…

【科研繪圖系列】R語言繪制模型預測與數據可視化

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 數據下載 函數 導入數據 數據預處理 畫圖 總結 系統信息 介紹 本文介紹了一種利用R語言進行海洋微生物群落動態分析的方法,該方法通過構建多個統計模型來預測不同環境…

TODO的面試(dw三面、sqb二面、ks二面)

得物的前端三面&#xff08;通常是技術終面&#xff09;會深入考察你的技術深度、項目經驗、解決問題的思路以及職業素養。下面我結合搜索結果&#xff0c;為你梳理一份得物前端三面的常問問題及詳解&#xff0c;希望能助你一臂之力。 &#x1f9e0; 得物前端三面常問問題及詳解…

開發 PHP 擴展新途徑 通過 FrankenPHP 用 Go 語言編寫 PHP 擴展

通過 FrankenPHP 用 Go 語言編寫 PHP 擴展 在 PHPVerse 2025 大會上&#xff08;JetBrains 為紀念 PHP 語言 30 周年而組織的會議&#xff09;&#xff0c;FrankenPHP 開發者 Kvin Dunglas 做了一個開創性的宣布&#xff1a;通過 FrankenPHP&#xff0c;可以使用 Go 語言創建 …

完美解決:應用版本更新,增加字段導致 Redis 舊數據反序列化報錯

完美解決&#xff1a;應用版本更新&#xff0c;增加字段導致 Redis 舊數據反序列化報錯 前言 在敏捷開發和快速迭代的今天&#xff0c;我們經常需要為現有的業務模型增加新的字段。但一個看似簡單的操作&#xff0c;卻可能給正在穩定運行的系統埋下“地雷”。 一個典型的場景是…

66-python中的文件操作

1. 文件的編碼 UTF-8 GBK GB2312 Big5 GB18030 2. 文件讀取 文件操作步驟: 打開文件 讀\寫文件 關閉文件 open(name,mode,encoding) name:文件名字符串 “D:/haha.txt” mode: 只讀、寫入、追加 r:以只讀方式打開 w: 只用于寫 a :用于追加 encoding:編碼方式 # -*- coding: utf…

FPGA實例源代碼集錦:27個實戰項目

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;FPGA是一種可編程邏輯器件&#xff0c;允許用戶根據需求配置硬件功能。本壓縮包提供27個不同的FPGA應用實例源代碼&#xff0c;旨在幫助初學者深入學習FPGA設計&#xff0c;并為專業工程師提供靈感。內容涵蓋了…

基于 Vue+Mapbox 的智慧礦山可視化功能的技術拆解

01、項目背景 在全球礦業加速向 “高端化、智能化、綠色化” 轉型的浪潮下&#xff0c;傳統礦業面臨的深地開采難題、效率瓶頸與安全隱患日益凸顯。 在礦業轉型的迫切需求與政策、技術支撐的背景下依托 GIS 技術&#xff0c;開展了 “中國智礦” GIS 開發項目&#xff0c;旨在…

進程狀態(Linux)

進程狀態Linux進程狀態Linux進程狀態進程描述R運行狀態S睡眠狀態D磁盤休眠狀態T停止狀態t被追蹤狀態(調試狀態)X死亡狀態Z僵死狀態其實大致也就可以分為三種運行&#xff0c;阻塞&#xff0c;掛起。運行狀態每個cpu里都有一個運行隊列&#xff0c;進程在運行隊列里&#xff0c;…

物聯網領域中PHP框架的最佳選擇有哪些?

物聯網&#xff08;IoT&#xff09;作為近年來快速發展的技術領域&#xff0c;已經滲透到智能家居、工業自動化、智慧城市等方方面面。作為Web開發中廣泛使用的語言&#xff0c;PHP憑借其易學易用、開發效率高和生態豐富的特點&#xff0c;也在物聯網領域找到了用武之地。 本文…

java反射(詳細教程)

我們平常創建類的實例并調用類中成員需要建立在一個前提下&#xff0c;就是已經知道類名和類中成員的信息&#xff0c;靈活性大大降低。甚至在一些項目中還需要修改源碼來滿足使用條件&#xff0c;大大降低了操作的靈活性。Java 反射&#xff08;Reflection&#xff09;是 Java…

消息隊列-初識kafka

優缺點 消息隊列的優點&#xff1a; 實現系統解耦&#xff1a; :::color5 系統解耦解釋 有 MQ 時是 “服務 A 發消息到隊列&#xff0c;其他服務從隊列拿消息&#xff0c;新增服務接隊列就行”&#xff1b;無 MQ 時是 “服務 A 直接調其他服務的接口 / 依賴&#xff0c;新增 / …

實踐《數字圖像處理》之Canny邊緣檢測、霍夫變換與主動二值化處理在短線段清除應用中的實踐

在最近的圖像處理項目中&#xff0c;其中一個環節&#xff1a;圖片中大量短線&#xff08;不是噪聲&#xff09;&#xff0c;需要在下一步處理前進行清除。在確定具體實現時&#xff0c;碰到了Canny邊緣檢測、霍夫變換與主動二值化處理的辯證使用&#xff0c;相關邏輯從圖片灰度…

vue3與ue5通信-工具類

工具 ue5-simple.js /*** UE5 通信工具* 兩個核心方法&#xff1a;發送消息和接收消息*/// 確保全局對象存在 if (typeof window ! undefined) {window.ue window.ue || {};window.ue.interface window.ue.interface || {}; }/*** 生成 UUID*/ function generateUUID() {retu…

在kotlin中如何使用像java中的static

在 Kotlin 中&#xff0c;沒有直接的 static 關鍵字&#xff0c;但有幾種等效的方式來實現 Java 中靜態成員的功能&#xff1a; 1. 伴生對象 (Companion Object) - 最常用 class MyClass {companion object {// 靜態常量const val STATIC_CONSTANT "constant value"…

如何在 Spring Boot 中指定不同的配置文件?

介紹 Spring Boot 提供了多種方式來管理和加載配置文件&#xff0c;特別是在多環境配置下&#xff0c;比如開發、測試和生產環境。通過指定不同的配置文件&#xff0c;可以靈活地調整應用程序的行為&#xff0c;以適應不同的需求。本文將介紹在 Spring Boot 中如何指定使用不同…

在centOS源碼編譯方式安裝MySQL5.7

一、前言 在生產環境中部署數據庫時&#xff0c;很多人會選擇直接使用 yum/apt 包管理器 安裝 MySQL&#xff0c;這樣簡單快速&#xff0c;但缺點是版本受限&#xff0c;靈活性不足。對于需要指定版本、啟用特定編譯參數或優化的場景&#xff0c;源碼編譯安裝 MySQL 就顯得非常…

探討Hyperband 等主要機器學習調優方法的機制和權衡

本篇文章Master Hyperband — An Efficient Hyperparameter Tuning Method in Machine Learning深入探討了Hyperband這一高效的超參數調優方法。文章的技術亮點在于其結合了多臂老虎機策略和逐次減半算法&#xff0c;能夠在大搜索空間中快速剔除表現不佳的配置&#xff0c;從而…

Mysql:InnoDB 關鍵特性

目錄 一、插入緩沖&#xff08;Change Buffer&#xff09;→ 快遞驛站的 “臨時存放區” 二、兩次寫&#xff08;Double Write&#xff09;→ 重要文件的 “備份存檔” 三、自適應哈希索引&#xff08;AHI&#xff09;→ 圖書館的 “熱門書快捷查找區” 四、異步 IO&#x…