C#編程與1200PLC S7通信

讀取q0.0的狀態,i0.0的狀態實時在窗口更新

PLC里寫一個程序? ?用常閉按鈕接i0.0信號 ,延時接通Q0.0

?

按按鈕,上位機測試效果,?

2396fcfa823aa951d

程序前提是引用了S7通信文件?

using Sharp7;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.AxHost;namespace _1200withC
{public delegate void delegateUsingUI();public partial class Form1 : Form{// 定義一個委托,用于更新 UIprivate delegate void UpdateUIDelegate(bool qState, bool iState);private bool _isRunning = true; // 用于控制線程的運行狀態private delegate void UpdateUIDelegate1(string message);public Form1(){InitializeComponent();Thread ThreadStationRead = new Thread(ThreadBackgroundStation);ThreadStationRead.IsBackground = true;ThreadStationRead.Priority = ThreadPriority.Highest;ThreadStationRead.Start();}private void Form1_FormClosing(object sender, FormClosingEventArgs e){_isRunning = false; // 關閉窗體時停止線程}//-------------------------開線程函數-----------------------------------------public void ThreadBackgroundStation(){delegateUsingUI delegateUsingUIS = new delegateUsingUI(uistart);delegateUsingUIS.Invoke();}public void uistart(){var Clinet = new S7Client();int Result = Clinet.ConnectTo("192.168.10.2", 0, 1);if (Result == 0){status.BackColor = Color.Green;statusS7.BackColor = Color.YellowGreen;while (_isRunning){try{// 讀取輸入區域的數據int ResultI;int startAddress = 0; // 起始地址int size = 1; // 讀取的字節數byte[] ibuffer = new byte[size];// 讀取過程映像輸入區域的數據ResultI = Clinet.ReadArea(S7Consts.S7AreaPE, 0, startAddress, size, S7Consts.S7WLByte, ibuffer);if (ResultI == 0){bool iState = S7.GetBitAt(ibuffer, 0, 0);int ResultQ;int startAddressQ = 0; // 起始地址int sizeQ = 1; // 讀取的字節數byte[] qbuffer = new byte[size];// 讀取過程映像輸出區域的數據ResultQ = Clinet.ReadArea(S7Consts.S7AreaPA, 0, startAddressQ, sizeQ, S7Consts.S7WLByte, qbuffer);if (ResultQ == 0){// 提取 Q0.0 的狀態bool qState = S7.GetBitAt(qbuffer, 0, 0);// 使用 Invoke 方法更新 UIif (this.InvokeRequired){this.Invoke(new UpdateUIDelegate(UpdateStateUI), qState, iState);}else{UpdateStateUI(qState, iState);}}}else{status.BackColor = Color.Red; ;statusS7.BackColor = Color.Red;}}catch(SocketException ) {// 檢測到網絡異常ShowNetworkError("網絡連接斷開,請檢查網絡連接!");break;}catch (Exception){// 其他異常處理ShowNetworkError("發生錯誤,請檢查連接!");break;}}Clinet.Disconnect();}else{ShowNetworkError("無法連接到 PLC,請檢查網絡連接!");}}//定義一個方法,用于更新 UIpublic void UpdateStateUI(bool qState, bool iState){// 更新 UI,例如在某個控件上顯示狀態label2.Text = qState ? "Q0.0 is ON" : "Q0.0 is OFF";labelIState.Text = iState ? "I0.0 is ON" : "I0.0 is OFF";}private void ShowNetworkError(string message){if (this.InvokeRequired){this.Invoke(new UpdateUIDelegate1(ShowNetworkErrorUI), message);}else{ShowNetworkErrorUI(message);}}private void ShowNetworkErrorUI(string message){MessageBox.Show(message, "網絡錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);status.BackColor = Color.Red;}}
}

?讀取?Q2.2

byte[] buffer = new byte[3]; // 分配3字節的緩沖區
int result = ABRead(2, 3, buffer); // 從Q2.0讀取3字節
?
if (result == 0) // 假設0表示成功
{
? ? // 成功讀取后處理buffer中的數據
? ? bool y22 = S7.GetBitAt(buffer, 0, 2); // 讀取第0字節的第2位(對應Q2.2)
? ? if (y22)
? ? {
? ? ? ? hslconveyer1.conveyeractive = true;
? ? }
}
else
{
? ? // 處理錯誤(如記錄日志或拋出異常)
? ? Console.WriteLine($"讀取失敗,錯誤代碼: {result}");
}

?讀取 I0.0

?#region
?//讀取DI數據
?var S7MULVAR = new S7MultiVar(Clinet);
?var buffer = new byte[9];

?S7MULVAR.Add(S7Consts.S7AreaPE, S7Consts.S7WLByte, 0, 0, buffer.Length, ref buffer);

?S7MULVAR.Read();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? bool X0 = S7.GetBitAt(buffer, 0, 0);//讀取I0.0的狀態
??if (X0)
?{
? ? ?L11.LanternBackground = Color.Yellow;?
?}
?#endregion

//讀取db數據
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #region

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byte[] buffersD = new byte[20];
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Clinet.DBRead(8, 0, 20, buffersD);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // double db8dbd10 = S7.GetLRealAt(buffersD, 10);//對應數據類型LReal,DB8的第10個字節數據
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? float db8dbd10 = S7.GetRealAt(buffersD, 10);//;//對應數據類型Real,DB8的第10個字節數據
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? label15.Text = db8dbd10.ToString();//
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #endregion

改進后可實時更新數據顯示的代碼:

using Sharp7;
using System;
using System.Drawing;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;namespace _1200PLC
{public partial class Form1 : Form{private delegate void UpdateUIDelegate(bool qState, bool iState, double db8dbd10);private delegate void UpdateStatusDelegate(bool connected);private delegate void ShowErrorDelegate(string message);private bool _isRunning = true;private S7Client _client; // 使用下劃線前綴表示私有字段public Form1(){InitializeComponent();_client = new S7Client();// 啟動后臺線程var thread = new Thread(ThreadBackgroundStation){IsBackground = true,Priority = ThreadPriority.Highest};thread.Start();}private void Form1_FormClosing(object sender, FormClosingEventArgs e){_isRunning = false;if (_client != null && _client.Connected){_client.Disconnect();}}private void ThreadBackgroundStation(){int result = _client.ConnectTo("192.168.10.2", 0, 1);if (result == 0){UpdateConnectionStatus(true);while (_isRunning){try{if (!_client.Connected){result = _client.ConnectTo("192.168.10.2", 0, 1);if (result != 0){UpdateConnectionStatus(false);Thread.Sleep(1000);continue;}UpdateConnectionStatus(true);}// 讀取輸入區域byte[] ibuffer = new byte[1];if (_client.ReadArea(S7Consts.S7AreaPE, 0, 0, 1, S7Consts.S7WLByte, ibuffer) == 0){bool iState = S7.GetBitAt(ibuffer, 0, 0);bool qState = false;double db8dbd10 = 0.0;// 讀取輸出區域byte[] qbuffer = new byte[1];if (_client.ReadArea(S7Consts.S7AreaPA, 0, 0, 1, S7Consts.S7WLByte, qbuffer) == 0){qState = S7.GetBitAt(qbuffer, 0, 0);}// 讀取DI數據var multiVar = new S7MultiVar(_client);var diBuffer = new byte[9];multiVar.Add(S7Consts.S7AreaPE, S7Consts.S7WLByte, 0, 0, diBuffer.Length, ref diBuffer);multiVar.Read();bool x0 = S7.GetBitAt(diBuffer, 0, 0);//UpdateUI(() => L11.LanternBackground = x0 ? Color.Yellow : SystemColors.Control);// 讀取DO數據var doBuffer = new byte[8];_client.ABRead(0, 1, doBuffer);bool y0 = S7.GetBitAt(doBuffer, 0, 0);UpdateUI(() => BTQ0.BackColor = y0 ? Color.Yellow : SystemColors.Control);// 讀取DB數據byte[] dbBuffer = new byte[20];if (_client.DBRead(8, 0, 20, dbBuffer) == 0){db8dbd10 = S7.GetLRealAt(dbBuffer, 10);}// 更新UIUpdateStateUI(qState, iState, db8dbd10);}else{UpdateConnectionStatus(false);}Thread.Sleep(100); // 適當延遲}catch (SocketException ex){ShowNetworkError($"網絡連接斷開: {ex.Message}");UpdateConnectionStatus(false);Thread.Sleep(1000);}catch (Exception ex){ShowNetworkError($"發生錯誤: {ex.Message}");UpdateConnectionStatus(false);Thread.Sleep(1000);}}_client.Disconnect();}else{ShowNetworkError("無法連接到 PLC,請檢查網絡連接!");UpdateConnectionStatus(false);}}private void UpdateStateUI(bool qState, bool iState, double db8dbd10){if (InvokeRequired){Invoke(new UpdateUIDelegate(UpdateStateUI), qState, iState, db8dbd10);return;}label2.Text = qState ? "Q0.0 is ON" : "Q0.0 is OFF";labelIState.Text = iState ? "I0.0 is ON" : "I0.0 is OFF";label15.Text = db8dbd10.ToString();Console.WriteLine($"DB8.DBD10: {db8dbd10}");}private void UpdateConnectionStatus(bool connected){if (InvokeRequired){Invoke(new UpdateStatusDelegate(UpdateConnectionStatus), connected);return;}status.BackColor = connected ? Color.Green : Color.Red;statusS7.BackColor = connected ? Color.YellowGreen : Color.Red;}private void ShowNetworkError(string message){if (InvokeRequired){Invoke(new ShowErrorDelegate(ShowNetworkError), message);return;}MessageBox.Show(message, "網絡錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);}// 輔助方法簡化UI更新private void UpdateUI(Action uiAction){if (InvokeRequired){Invoke(uiAction);}else{uiAction();}}}
}
注意事項:?

添加引用:1----復制文件到路徑文件夾。2---添加引用,瀏覽,選中文件,確認。

報錯? warning MSB3274: 未能解析主引用“Sharp7, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL”,因為它是針對“.NETFramework,Version=v4.8”框架生成的。該框架版本高于當前目標框架“.NETFramework,Version=v4.7.2”。

問題出在項目目標框架和 Sharp7 庫的目標框架不匹配。具體來說,Sharp7 庫是針對 .NET Framework 4.8 構建的,而你的項目目標框架是 .NET Framework 4.7.2。

解決方案
你有幾個選擇來解決這個問題:

更改項目目標框架
將項目的目標框架更改為 .NET Framework 4.8,以便與 Sharp7 庫兼容。

在 Visual Studio 中,右鍵點擊項目,選擇“屬性”。
在“應用程序”選項卡中,找到“目標框架”下拉菜單。
選擇 .NET Framework 4.8。
保存更改并重新生成項目。

運行效果:? ?變量和數據實時更新?

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

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

相關文章

el-table復選框分頁多選

場景: 你想要對el-table表格數據進行批量處理,會使用復選框,但如果表格的數據是分頁請求回來的,則在切換頁碼的時候,之前選中的數據會被清空掉,本文就是為了解決這個問題。 解決思路: 主要分…

大IPD之——學習華為的市場隊伍建設(二十)

企業要生存,就必須要擁有自己的核心競爭力。這樣在行業內與其他企業競爭時,才能立于不敗之地,而伴隨著企業的市場化,市場機制對企業價值創造的影響力越來越大。30多年來,華為高度重視市場隊伍與市場能力建設&#xff0…

Datawhlale_快樂學習大模型_task02_NLP 基礎概念

書籍地址 簡要總結一下個人理解 文章目錄 1.1 NLP1.2 發展歷程1.3 NLP任務1.3.1 中文分詞1.3.2 子詞切分1.3.3 詞性標注1.3.4 文本分類1.3.5 實體識別1.3.6 關系抽取1.3.7 文本摘要1.3.8 機器翻譯1.3.9 自動問答 1.4 文本表示的發展1.4.1 詞向量1.4.2 語言模型1.4.3 Word2Vec…

AUTOSAR圖解==>AUTOSAR_AP_SWS_Persistency

AUTOSAR 持久化功能集群解析 1. 引言 AUTOSAR (AUTomotive Open System ARchitecture) 適配平臺中的持久化功能集群(Persistency Functional Cluster)是一個核心組件,為應用程序提供數據持久化服務。本文檔詳細分析了AUTOSAR持久化功能集群的架構、主要組件和工作…

Ollama常用命令詳解:本地大語言模型管理指南

前言 Ollama是一個強大的本地大語言模型管理工具,讓我們可以輕松地在本地部署和運行各種開源大模型。本文將詳細介紹Ollama的核心命令使用方法,幫助您快速上手本地AI模型的管理和使用。 1. 查看已安裝模型 - ollama list 基本用法 ollama list功能說…

[免費]SpringBoot+Vue共享單車信息系統【論文+源碼+SQL腳本】

大家好,我是java1234_小鋒老師,看到一個不錯的SpringBootVue共享單車信息系統【論文源碼SQL腳本】,分享下哈。 項目視頻演示 【免費】SpringBootVue共享單車信息系統 Java畢業設計_嗶哩嗶哩_bilibili 項目介紹 快速發展的社會中&#xff…

內網提權-DC-3靶場實驗(Ubantu16.04)

靶場地址 https://download.vulnhub.com/dc/DC-3-2.zip 打開DC-3 使用kali掃描獲取靶場ip 目錄掃描獲取后臺地址 弱口令admin/snoopy進入后臺 此處可寫入一句話木馬 創建文件寫入一句話木馬 哥斯拉上線 使用lsb_release -a命令查看內核版本 方法一 使用ubuntu漏洞庫發現該…

Nginx:互斥鎖 accept_mutex配置

如何配置 Nginx 的互斥鎖 accept_mutex 1. 理解 accept_mutex 的作用 accept_mutex 是 Nginx 用于控制多工作進程(worker processes)接收新連接時避免「驚群問題(Thundering Herd)」的機制。 啟用時(accept_mutex o…

aws(學習筆記第四十六課) codepipeline-build-deploy

文章目錄 aws(學習筆記第四十六課) codepipeline-build-deploy學習內容:1. 代碼鏈接及整體架構1.1 代碼鏈接1.2 整體架構1.2.1 初始化階段的`codecommit repo`以及`codebuild project`設定1.2.2 創建`vpc`,`public alb`,`alb listener`以及`fargate service`等1.2.3 創建`so…

Vue 項目中的組件職責劃分評審與組件設計規范制定

在現代前端系統中,Vue(無論是 2.x 還是 3.x)提供了良好的組件化機制,為構建復雜交互系統打下了基礎。然而,隨著項目規模增長,組件職責不清、代碼重疊、維護困難等問題頻發,嚴重影響開發效率與可…

react 的過渡動畫

一、React的過渡動畫 1、react-transition-group 在開發中,我們想要給一個組件的顯示和消失,添加某種過渡動畫,可以很好的增加用戶體驗, React社區為我們提供了react-transition-group用來完成過渡動畫, React曾為…

深度學習:PyTorch人工神經網絡優化方法分享(1)

本文目錄: 一、從梯度角度入手(一)梯度下降算法回顧(二)常用優化算法1.SGD(Stochastic Gradient Descent)- 隨機梯度下降2.BGD (Batch Gradient Descent) - 批量梯度下降3.MBGD (Mini-Batch Gra…

(三)yolov5——模型訓練

一、準備數據 先準備一個MP4的視頻 1.測試一幀 使用opencv來提取每一個視頻的幀 先使用以下代碼查看一幀的內容,是否符合預期 import cv2 import matplotlib.pyplot as plt# 打開視頻文件 video cv2.VideoCapture("111.mp4") # 讀取一幀 ret, frame…

008 Linux 開發工具(下) —— make、Makefile、git和gdb

🦄 個人主頁: 小米里的大麥-CSDN博客 🎏 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 🎁 GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄 Linux 開發工具(下)Linux 項目自動化構建工…

前綴和題目:連續的子數組和

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題:連續的子數組和 出處:523. 連續的子數組和 難度 5 級 題目描述 要求 給定一個整數數組 nums \texttt{nums} nums 和一個整數 k \tex…

隊的簡單介紹

隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出 FIFO(First In First Out)的特點。 入隊列:進行插入操作的一端稱為隊尾。 出隊列:進行刪除操作的一端稱為隊頭。 入隊列…

AI-Sphere-Butler之如何將豆包桌面版對接到AI全能管家~新玩法(一)

環境: AI-Sphere-Butler VBCABLE2.1.58 Win10專業版 豆包桌面版1.47.4 ubuntu22.04 英偉達4070ti 12G python3.10 問題描述: AI-Sphere-Butler之如何將豆包桌面版對接到AI全能管家~新玩法(一) 聊天視頻: AI真…

【STM32】啟動流程

1、.s啟動文件解析 STM32的啟動文件(一般是.s匯編文件,如startup_stm32f407xx.s)是STM32上電后執行的第一段代碼,承擔著“系統初始化化引導員”的角色。 它的主要作用是設置初始化棧指針(SP)、程序計數器&…

【vim】通過vim編輯器打開、修改、退出配置文件

通過vim編輯器打開任一配置文件 vim /etc/profile 英文輸入下,按i鍵進入INSERT模式,修改配置文件 完成修改后,按esc鍵退出INSERT模式 英文輸入下,輸入":wq!",即可保存并退出 :q #不保存并退出 :q! …

Effective Modern C++ 條款6:當 auto 推導類型不符合預期時,使用顯式類型初始化慣用法

在C開發中,auto關鍵字以其簡潔性和高效性被廣泛使用。然而,“自動推導”并非萬能,尤其在某些特殊場景下,auto的推導結果可能與開發者預期不符,甚至導致未定義行為。今天,我們以《Effective Modern C》條款6…