当前位置: 首页 > news >正文

C#编写上位机通过OPC DA读取西门子PLC数据

Sync_RW

引用:Quick.OpcComRcw

文档中原程序会报错:

原因:需要在安装有Simatic NET V14的电脑上运行这个程序。

需要注释掉下面程序,否则读取时会无故障提示退出。

 //finally里的程序要注释掉,否则一点击read按钮,程序会直接无故障提示退出//finally//{//    // Free the unmanaged memory//    if (pItemValues != IntPtr.Zero)//    {//        Marshal.FreeCoTaskMem(pItemValues);//        pItemValues = IntPtr.Zero;//    }//    if (pErrors != IntPtr.Zero)//    {//        Marshal.FreeCoTaskMem(pErrors);//        pErrors = IntPtr.Zero;//    }//}

可能的原因:

  1. 访问违规(Access Violation):如果Marshal.PtrToStructure在尝试转换指针时指向了无效的内存地址,可能会导致访问违规。
  2. 内存泄漏/损坏:在调用Marshal.PtrToStructure之前,如果指针已经被释放或者被错误地使用,可能会引发问题。
  3. 线程问题:如果UI操作在非UI线程上执行,可能会导致未预期的行为。
  4. 资源释放问题:在finally块中,如果Marshal.FreeCoTaskMem被调用两次,可能会引发问题。

其他解决方案:(未测试)

1.增强异常处理:您可以在按钮点击事件处理程序的外围添加额外的异常处理,以确保任何未捕获的异常都能被捕获并记录下来。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{// 在窗体关闭之前检查是否有未处理的异常if (Environment.HasShutdownStarted == false){e.Cancel = true;MessageBox.Show("An unexpected error has occurred. The application will now close.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}// 在Main方法中注册全局异常处理
[STAThread]
static void Main()
{Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);try{Application.Run(new Form1());}catch (Exception ex){MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{MessageBox.Show(e.Exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{MessageBox.Show((e.ExceptionObject as Exception).Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
  1. 检查内存操作:确保在调用Marshal.PtrToStructure之前,指针是有效的,并且不要在释放内存之后再次使用指针。
  2. 线程同步:确保UI更新在UI线程上执行。
  3. 调试:使用调试器运行程序,并设置断点以检查Marshal.PtrToStructure调用之前和之后的指针状态。检查是否有任何访问违规或其他异常。
  4. 日志记录:在代码的关键部分添加日志记录,以便在程序崩溃时能够更好地理解发生了什么。

请注意,由于Marshal.PtrToStructure和内存管理涉及非托管代码,错误可能很难追踪。如果您不确定如何处理,请确保遵循正确的内存管理实践,并考虑使用更高级别的库来处理OPC通信,这样可以减少直接与内存和指针打交道的风险。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • EmguCV学习笔记 C# 11.3 DNN其它
  • C++学习笔记(20)
  • Unity for Android使用蓝牙低功耗Bluetooth LE
  • linux 操作系统下crontab命令及使用案例介绍
  • mysql对于上期同期的时间的处理
  • 【QT】使用QOpenGLWidget后,窗口全屏之后右键菜单出不来的问题
  • 软件测试面试少走弯路
  • burp suite professional 产品介绍
  • 程序员转行方向推荐
  • 99AutoML 自动化机器学习实践--NNI 自动化机器学习工具包
  • Rider使用习惯
  • 【C++】——string类的模拟实现
  • OpenAI o1 Review 大模型PHD水平数理推理能力 OpenAI o1 vs GPT4o vs Gemini vs Claude
  • SVN的使用技巧
  • 《黑神话:悟空》怎么备份游戏存档?
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • JAVA_NIO系列——Channel和Buffer详解
  • MaxCompute访问TableStore(OTS) 数据
  • Octave 入门
  • Transformer-XL: Unleashing the Potential of Attention Models
  • use Google search engine
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 浮现式设计
  • 算法系列——算法入门之递归分而治之思想的实现
  • 通过几道题目学习二叉搜索树
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 我是如何设计 Upload 上传组件的
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #每日一题合集#牛客JZ23-JZ33
  • %check_box% in rails :coditions={:has_many , :through}
  • (C++17) optional的使用
  • (function(){})()的分步解析
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (力扣题库)跳跃游戏II(c++)
  • (六)c52学习之旅-独立按键
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .net mvc部分视图
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • //解决validator验证插件多个name相同只验证第一的问题
  • /var/lib/dpkg/lock 锁定问题
  • @RequestMapping-占位符映射
  • @SuppressWarnings注解
  • [ NOI 2001 ] 食物链
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [APUE]进程关系(下)
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)