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

news2024/11/14 13:28:59

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通信,这样可以减少直接与内存和指针打交道的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

招商银行信用卡中心编程练习题题解(全)

第一天 递归:LeetCode21.合并两个有序链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode…

掌握生成树 (STP、RSTP、MSTP) 最详细配置,轻松优化网络

目录 一. 实验内容 STP配置实验 RSTP配置实验 MSTP配置实验 二. 1 ) STP配置实验 实验拓扑 ​编辑 实验配置 实验结果 2 ) RSTP配置实验 实验拓扑 实验配置 实验结果 3 ) MSTP配置实验 实验拓扑 实验配置 ​编辑 实验结果 三 实验总结 一. 实验内容 1) …

齐齐哈尔医院系统等保测评,安全防护全面升级

随着数字化时代的到来,医疗系统的信息化建设日益重要。然而,随之而来的数据安全问题也成为了医疗机构必须面对的重大挑战。为了保障患者信息的安全以及整个医疗系统的稳定运行,齐齐哈尔市某医院近期进行了等保(等级保护&#xff0…

vue-router 之如何在模版(template)中获取路由配置信息?

vue-router 之如何在模版(template)中获取路由配置信息? 获取当前路由信息 在vue3 中,route通常使用useRoute()钩子获取的,**代表当前激活的路由信息。**它包含了与当前路由相关的数据,比如路径、参数、查…

小米对讲机2S申请业余无线电台执照

首先,小米对讲机2S是可以用来申请业余无线电台执照得,对讲机、电台在工信部能查到核准代码即可。 工业和信息化部政务服务平台 在小米对讲机2S底部有核准代码 2022FP10742,搜索后即可看到详细信息。 有一点矛盾的是,在这里查询到…

ML 系列:机器学习和深度学习的深层次总结(02)线性回归

ML 系列: — 简单线性回归 线性回归、损失函数、假设函数 图 1.线性回归 文章目录 一、说明二、线性回归2.1 简单线性回归2.2 回归中的损失函数 三、线性回归中的评估标准四、线性回归模型训练五、可视化5.1 假设函数5.2 计算训练模型的损失:5.3 绘制 H…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9517开发指南(兼容PCF9517)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.电平转换 2.芯片使能/失能 EN 引脚为高电平有效,内部上拉至 VCC(B),允许用户选择中继器何时有效。这可用于在上电时隔离行为不良的从机,直到…

饭店起名|饭店怎么起名有创意

给饭店起名是一个非常重要的任务,对于饭店的经营和吸引力都有着重要的影响。一个好的饭店名字能够吸引顾客、传达出饭店的风格和特色。在起名之前,我们需要先考虑一些因素,例如饭店的定位、菜品特色、目标顾客、所在地区等。下面是一些建议可…

20章 线性表、栈、队列和优先队列

1.编写一个程序,从文本文件读取单词,并按字母的升序显示所有的单词(可以重复)。单词必须以字母开头。文本文件作为命令行参数传递。 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays;pu…

python-数字反转

题目描述 给定一个整数 N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。 输入格式 一个整数 N。 输出格式 …

数据结构基础讲解(七)——数组和广义表专项练习

本文数据结构讲解参考书目: 通过网盘分享的文件:数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 数据结构基础讲解(六)——串的专项练习-CSDN博客 个人主页:樱娆…

猫头虎分析:iPhone 16 系列哪款更适合你?买 iPhone 16 选哪款好?

猫头虎分析:iPhone 16 系列哪款更适合你?买 iPhone 16 选哪款好? 大家好,我是猫头虎。每年苹果发布新机型时,总能引发广泛的讨论和期待。今年也不例外,苹果发布了备受瞩目的 iPhone 16 系列,无…

uniapp媒体

uni.previewImage实现图片放大预览 // 图片预览函数function onPreview(index) {// 收集所有图片的urlvar urls pets.value.data.map(item > item.url)// 预览图片uni.previewImage({current: index, // 当前预览的图片索引urls: urls // 所有图片的url数组})}

COCOS:(飞机大战02)简单的帧动画制作

飞机大战知识点总结 先准备2张图片 选中飞机Body,01:添加动画组件,02:新建动画剪辑资源,保存到动画目录。 在动画编辑器中先增加属性,点加号,选择cc.Sprite,选择spriteFrame把飞机图片hero0 拖…

项目售后服务方案(Word原件2024)

售后服务体系 售后服务流程 售后服务承诺 售后服务计划 技术支持响应承诺 售后服务响应时间 1.2 项目培训方案 项目培训体系 项目培训管理 培训目的与措施 项目培训安排 培训告知下达 培训人员贯彻 培训签到表 工作安排任务书,可行性分析报告,立项申请审…

聚观早报 | 拼多多“百亿减免”新政策;石头洗地机A30系列发布

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 9月10日消息 拼多多“百亿减免”新政策 石头洗地机A30系列发布 iQOO 13将采用京东方定制屏幕 iPhone 16 Pro或支…

Lombok失效:报错 找不到符号 Springboot项目

错误原因,Springboot项目为Lombok提供了版本管理的支持,所以引入Lombok依赖的时候,无需手动指定版本,手动指定了可能会导致依赖冲突。 去掉手动指定的版本,问题解决

Why I‘m getting 404 Resource Not Found to my newly Azure OpenAI deployment?

题意:为什么我新部署的Azure OpenAI服务会出现404资源未找到的错误? 问题背景: Ive gone through this quickstart and I created my Azure OpenAI resource created a model deployment which is in state succeedded. I also playaround …

使用Kimi生成Node-RED的代码

目录 引言 Kimi生成 导入Node-RED 引言 前面写过几篇博客介绍了Node-RED的使用。Node-RED使用起来已经很方便了,拖拉一下就可以生成程序流。当然,如果想偷懒,可以借助Kimi。 Kimi生成 Kimi不能生成图形,但是Node-RED支持JS…

Mysql事件操作

查看是否开启事件 SELECT event_scheduler; SHOW VARIABLES LIKE %event_scheduler%; 开启或关闭事件 SET GLOBAL event_scheduler 1; SET GLOBAL event_scheduler on; SET GLOBAL event_scheduler 0; SET GLOBAL event_scheduler off; 创建事件sql CREATE EVENT IF…