读取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…