C#與西門子PLC通信:S7NetPlus和HslCommunication使用指南

西門子S7協議是用來和PLC進行通訊的一個協議,默認端口是102,數據會保存在一個個DB塊中,比較經典的用法是一個DB塊專門用來讀取,一個用來寫入。

DB(數據塊)+ {塊號}.DBX/DBD/DBW+{字節地址}.{位偏移}

1、數據塊是存放全局變量的內存區域,類似數據庫的表.

2、三種類型的字節地址是共用的,所以要特別注意不同數據類型占用的長度是不同的,否則會出現異常數據的情形。

提到字節排列就得提到不同的通信設備的排列方式是有區別的,像是C#,三菱PLC就是小端排列類似于ABCD,4個字母表示4個字節;西門子PLC是大端排列,順序是DCBA,modbus等協議是不規則排列,順序有BADC,CDAB。

DBX(data block bit) 按位訪問,用于訪問數據塊中的單個位即Bool類型,例如: DB1.DBX0.1 表示數據塊1的第0字節的第0位。

每個字節有8位,所以偏移量的范圍是0~7.

DBW(Data Block Word)數據塊字,用于訪問16位的數據,例如:Word,int類型。由于1個字 = 16位也就是2個字節,所以地址必須是偶數,無需使用位偏移

例如:DB1.DBW0表示數據塊1的第0個字節開始的16位數據

DBD(data block double word)數據塊雙字,用于訪問32位的數據,例如:DWord,Dint,Real類型。由于1個雙字 = 32位也就是4個字節,所以地址必須是4的整數,無需使用位偏移

例如:DB1.DBD0表示數據塊1的第0個字節開始的32位數據

使用C#實現西門子S7通訊可以通過S7NetPlus,HslCommunication類庫來實現

1、使用S7NetPlus實現讀寫數據

    // 第一個參數是CPU的型號// 第三個參數是PLC的機架(Rank)// 第四個參數是CPU的插槽(Slot)using (var plc = new Plc(CpuType.S71200, "127.0.0.1", 0, 1)){try{plc.Open();if (plc.IsConnected == false){this.textBox1.Text = this.textBox1 + "連接失敗" + Environment.NewLine;}#region 寫入數據// 寫入一個bool類型plc.Write("DB1.DBX0.0", true);// 寫入一個無符號整數ushort ushortValue = 3600;plc.Write("DB1.DBW2.0", ushortValue);// 寫入一個浮點數float floatValue = 3.14f;plc.Write("DB1.DBD4", floatValue);// 寫入一個有符號整數int intValue = 2025;plc.Write("DB1.DBD8", intValue);#endregion#region 讀取數據// 讀取一個bool類型var is_am = (bool)plc.Read("DB1.DBX0.0");this.textBox1.Text = this.textBox1.Text + "is_am=" + is_am + Environment.NewLine;// 讀取一個無符號的整數類型 - word 對應c#的就是ushort類型var second = (ushort)plc.Read("DB1.DBW2.0");this.textBox1.Text = this.textBox1.Text + "second=" + second + Environment.NewLine;// 讀取一個浮點數var pie = ((uint)plc.Read("DB1.DBD4")).ConvertToFloat();this.textBox1.Text = this.textBox1.Text + "pie=" + pie + Environment.NewLine;// 讀取一個有符號的整數var year = ((uint)plc.Read("DB1.DBD8")).ConvertToInt();this.textBox1.Text = this.textBox1.Text + "year=" + year + Environment.NewLine;#endregion}catch (Exception ex){this.textBox1.Text = this.textBox1 + ex.Message + Environment.NewLine;}}

2、使用HslCommunication實現讀寫功能

寫入:

        plc = new SiemensS7Net(SiemensPLCS.S1200, "127.0.0.1");Random random = new Random();var flag = await plc.WriteAsync("DB1.DBX0", random.Next(0, 2) == 0 ? false : true);var int_value = await plc.WriteAsync("DB1.DBW2", (short)random.Next(0, 1000));var float_value = await plc.WriteAsync("DB1.DBD4", (float)random.Next(0, 10) / 10.0f);// 中文不能使用默認的Ascii編碼,需要使用UTF8編碼var arr = new string[3] { "中", "美", "日" };var string_value = await plc.WriteAsync("DB1.DBD8", arr[random.Next(0, 3)], Encoding.UTF8);await Task.Delay(1000, cts.Token);if (int_value.IsSuccess == false){this.Invoke(new Action(() => {this.textBox1.Text = "通訊失敗" + Environment.NewLine + this.textBox1.Text;}));continue;}

讀取:

    plc = new SiemensS7Net(SiemensPLCS.S1200, "127.0.0.1");var flag = await plc.ReadBoolAsync("DB1.DBX0");var int_value = await plc.ReadInt16Async("DB1.DBW2");var float_value = await plc.ReadFloatAsync("DB1.DBD4");// 讀取中文不能使用默認的Ascii編碼,需要使用UTF8編碼var string_value = await plc.ReadStringAsync("DB1.DBD8", Encoding.UTF8);await Task.Delay(1000, cts.Token);if (int_value.IsSuccess == false){this.Invoke(new Action(() => {this.textBox1.Text = "通訊失敗" + Environment.NewLine + this.textBox1.Text;}));continue;}this.Invoke(new Action(() =>{this.textBox1.Text = "flag:" + flag.Content.ToString() + Environment.NewLine + this.textBox1.Text;this.textBox1.Text = "float_value:" + float_value.Content.ToString() + Environment.NewLine + this.textBox1.Text;this.textBox1.Text = "int_value:" + int_value.Content.ToString() + Environment.NewLine + this.textBox1.Text;this.textBox1.Text = "string_value:" + string_value.Content.ToString() + Environment.NewLine + this.textBox1.Text;}));

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

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

相關文章

【中間件】brpc_基礎_remote_task_queue

文章目錄 remote task queue1 簡介2 核心功能2.1 任務提交與分發2.2 無鎖或低鎖設計2.3 與 bthread 深度集成2.4 流量控制與背壓 3 關鍵實現機制3.1 數據結構3.2 任務提交接口3.3 任務竊取(Work Stealing)3.4 同步與喚醒 4 性能優化5 典型應用場景6 代碼…

C語言實現數據結構:堆排序和二叉樹_鏈式

一.堆的應用 1.堆排序 void test01() {int arr[] { 17,20,10,13,19,15 };int n sizeof(arr) / sizeof(arr[0]);HP p;HPInit(&p);for (int i 0; i < n; i){HPPush(&p, arr[i]);}int i 0;while (!HPEmpty(&p)){arr[i] HPTop(&p);HPPop(&p);}for (i…

C和指針——預處理

預處理是編譯前的過程&#xff0c;主要對define&#xff0c;include以及一些編譯器定義的內容進行替換 #define的本質就是替換 1、例子 #define FOREVER for(;;) 2、例子 #define TEMPD "1231231231\ 123123123" \\如果太長了&#xff0c;可以用\換行 3、例子——可…

C++ set和map

目錄 一、關聯式容器 1.1 鍵值對 1.1.1 概念 1.1.2 pair 1.2 樹形結構的關聯式容器 二、set 2.1 set 的介紹 2.2 set 的使用 2.2.1 set 的構造 2.2.2 set 的迭代器 2.2.3 set 的容量操作 2.2.4 set 的修改操作 2.2.5 set 的查找操作 三、multiset 3.1 multiset …

「Mac暢玩AIGC與多模態07」開發篇03 - 開發第一個 Agent 插件調用應用

一、概述 本篇介紹如何在 macOS 環境下,基于 Dify 平臺自帶的網頁爬蟲插件工具,開發一個可以提取網頁內容并作答的 Agent 應用。通過使用內置插件,無需自定義開發,即可實現基本的網頁信息提取與智能體回答整合。 二、環境準備 1. 確認本地部署環境 確保以下環境已搭建并…

cline或業務系統集成n8n的工作流(MCP Server Trigger、Call n8n Workflow Tool node)

1.成果展示 1.1n8n的主工作流 1.2n8n的子工作流 1.3cline集成效果 2.實操過程 2.1Call n8n Workflow Tool node節點 Call n8n Workflow Tool節點是一個工具&#xff0c;它允許代理運行另一個n8n工作流并獲取其輸出數據。 在此頁面上&#xff0c;您將找到“調用n8n工作流工具…

深入了解Linux系統—— 環境變量

命令行參數 我們知道&#xff0c;我們使用的指令它本質上也是一個程序&#xff0c;我們要執行這個指令&#xff0c;輸入指令名然后回車即可執行&#xff1b;但是對于指令帶選項&#xff0c;又是如何實現的呢&#xff1f; 問題&#xff1a;main函數有沒有參數&#xff1f; 在我…

pip安裝包時網絡不暢,替換國內PyPI鏡像源

1、PyPI 鏡像源 1.1、定義 PyPI 鏡像源是對 Python Package Index&#xff08;PyPI&#xff09;官方倉庫的復制。 PyPI 是 Python 社區中最大的軟件包倉庫&#xff0c;存儲著大量的 Python 包&#xff0c;供開發者們下載和使用。 然而&#xff0c;由于 PyPI 服務器位于國外&a…

貪心算法解決會議安排問題

文章目錄 前言 一、什么是貪心算法&#xff1f; 貪心算法的基本概念&#xff1a;貪心算法并不從整體最優上加以考慮&#xff0c;所做的選擇只是在某種意義上的局部最優選擇。 二、會議安排題目 1.題目理解 2.思路剖析 總結 前言 本文將主要介紹貪心算法需要注意的地方以…

從入門到登峰-嵌入式Tracker定位算法全景之旅 Part 4 |IMU 死算與校正:慣性導航在資源受限環境的落地

Part 4 |IMU 死算與校正:慣性導航在資源受限環境的落地 本章聚焦 ESP32-S3 平臺上如何利用 LSM6DS3 IMU 實現 死算(Dead Reckoning),并結合 零速更新(ZUPT) 或 磁力計輔助 進行 漂移校正,最終通過 EKF/UKF 融合提升定位精度。 一、傳感器簡介與校準 LSM6DS3 主要參數 加速…

力扣1128題解

記錄 2525.5.4 題目&#xff1a; 思路&#xff1a; 先將dominoes[i]的二元全部變為前大后小的形式&#xff0c;再遍歷該數組&#xff0c;用數組來記錄。 代碼&#xff1a; class Solution {public int numEquivDominoPairs(int[][] dominoes) {int [] [] cnt new int [10…

with的用法

Python SQLite 操作詳解 本文檔詳細解釋了使用 Python 操作 SQLite 數據庫時涉及的關鍵概念和代碼實踐&#xff0c;包括 with 語句、事務處理、批量插入以及相關的優化建議。 一、with 語句的作用&#xff08;自動關門的保險庫&#xff09; with sqlite3.connect(city_1301.d…

力扣解題匯總(困難)

文章目錄 技巧42_接雨水 技巧 42_接雨水 class Solution {public int trap(int[] height) {int LMax 0, RMax 0;int len height.length;int[] L2R new int[len];int[] R2L new int[len];//計數每一個格的左右邊最高柱for (int i 0; i < len; i) {LMax Math.max(LMa…

【Redis】Redis常用命令

4.Redis常見命令 4.1 Redis數據結構介紹 Redis是一個key-value的數據庫&#xff0c;key一般是String類型&#xff0c;不過value的類型多種多樣&#xff1a; 命令太多&#xff0c;不需要死記&#xff0c;學會查詢就好了~ Redis為了方便我們學習&#xff0c;將操作不同數據類型…

Ubuntu 系統上廣受好評的瀏覽器推薦

日常使用與開發者首選 Firefox 特點&#xff1a;開源、隱私保護強大&#xff0c;支持豐富擴展&#xff08;如開發者工具、廣告攔截&#xff09;&#xff0c;默認預裝且跨平臺兼容368。 適用場景&#xff1a;日常瀏覽、開發者調試&#xff08;支持實時 CSS/JS 編輯&#xff09;、…

Rust Trait 學習

概述 特征&#xff08;trait&#xff09;是rust中的概念&#xff0c;類似于其他語言中的接口&#xff08;interface&#xff09;。特征定義了一個可以被共享的行為&#xff0c;只要實現了特征&#xff0c;你就能使用該行為。 如果不同的類型具有相同的行為&#xff0c;那么我們…

JavaScript性能優化實戰(9):圖像與媒體資源優化

引言 在當今視覺驅動的網絡環境中,圖像和媒體資源往往占據了網頁總下載量的60%-80%,因此對圖像和媒體資源進行有效優化已成為前端性能提升的關鍵領域。盡管網絡帶寬持續提升,但用戶對加載速度的期望也在不斷提高,特別是在移動設備和網絡條件不穩定的場景下。 本文作為Jav…

NHANES指標推薦:LC9

文章題目&#xff1a;Association between lifes crucial 9 and kidney stones: a population-based study DOI&#xff1a;10.3389/fmed.2025.1558628 中文標題&#xff1a;生命的關鍵 9 與腎結石之間的關聯&#xff1a;一項基于人群的研究 發表雜志&#xff1a;Front Med 影響…

谷歌 NotebookLM 支持生成中文播客

谷歌 NotebookLM 支持生成中文播客。 2025 年 4 月 29 日&#xff0c;NotebookLM 宣布其 “音頻概覽”&#xff08;Audio Overviews&#xff09;功能新增 76 種語言支持&#xff0c;其中包括中文。用戶只需將文檔、筆記、研究材料等上傳至 NotebookLM&#xff0c;然后在設置中選…

ElasticSearch深入解析(十):字段膨脹(Mapping 爆炸)問題的解決思路

文章目錄 一、核心原理&#xff1a;動態映射的雙刃劍1. 動態映射的工作機制2. 映射爆炸的觸發條件3. 底層性能損耗 二、典型場景與案例分析1. 日志系統&#xff1a;動態標簽引發的災難2. 物聯網數據&#xff1a;設備屬性的無序擴展 三、系統性解決方案1. 架構層優化2. 配置層控…