读取PLC中的结构体时,总是提示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述

读取PLC中的结构体时,总是提示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏,但是,我把string[]改成char[]时,可以读到300个单字符,是数据类型的问题么?usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingTwinCAT.Ads;usingSystem.IO;namespaceCodeMsg{publicpartialclassForm1:Form{publicTcAdsClientadsClient;privateintCodeTxt1;[StructLayout(LayoutKind.Sequential,Pack=0)]//分布结构体内内存地址的位置publicclassCodeTxtStru{[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst=300,ArraySubType=UnmanagedType.BStr)]publicstring[]CodeTxt=newstring[300];}privatevoidFillCodeTXT(CodeTxtStruCTstructure){for(inti=0;i<300;i++){app.CodeTxt[i]=CTstructure.CodeTxt[i];}}publicForm1(){InitializeComponent();adsClient=newTcAdsClient();try{adsClient.Connect("192.168.1.11.1.1",801);CodeTxt1=adsClient.CreateVariableHandle("MAIN.Codemsg");}catch(Exceptionex){MessageBox.Show(ex.Message);}}privatevoidbutton1_Click(objectsender,EventArgse){FillCodeTXT((CodeTxtStru)adsClient.ReadAny(CodeTxt1,typeof(CodeTxtStru)));}privatevoidForm1_Load(objectsender,EventArgse){for(inti=0;i<300;i++){DataGridViewRowdgvr=newDataGridViewRow();foreach(DataGridViewColumncinthis.Codedata.Columns){dgvr.Cells.Add(c.CellTemplate.Clone()asDataGridViewCell);}dgvr.Cells[0].Value=app.CodeTxt[i];this.Codedata.Rows.Add(dgvr);}}}}PLC中的结构体定义:TYPECodeMSG:STRUCTCodeTxt:ARRAY[1..300]OFSTRING(32);END_STRUCTEND_TYPEMAIN中引用:PROGRAMMAINVARCodemsg:CodeMSG;END_VAR求高手解答!

解决方案

解决方案二:
我觉得有可能是PLC里面设置了string是定长的:string(32)的问题那么我在[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst=300,ArraySubType=UnmanagedType.BStr)]publicstring[]CodeTxt=newstring[300];这一句时改为publicStringBuilder[CodeTxt=newStringBuilder[300];时,如何设置StringBuilder[]的定长为32呢?
解决方案三:
这个问题,你应该问PLC厂家要通信协议啊自己瞎猜?
解决方案四:
我有ADS通信资料,但是里面只有除string[]外其它所有类型的资料,独独没有string[]的,同样的结构体用int[]、char[]实现起来都没有问题,就是string[]出错。。。单独一条一条的读,用string变量接收没有问题,但是300条……太多了!要写300个句柄!
解决方案五:
CodeTxt:ARRAY[1..300]OFSTRING(32);---------32在哪儿?
解决方案六:
引用4楼ghao0的回复:

CodeTxt:ARRAY[1..300]OFSTRING(32);---------32在哪儿?

这是PLC程序中的语句,是给STRING设置定长。这段程序是通过ADS通讯从PCL程序里读取数据,C#里的STRING不是变长的么?如果要在C#里设置字符数定长的string[]要怎么设置?
解决方案七:
引用2楼Z65443344的回复:

这个问题,你应该问PLC厂家要通信协议啊自己瞎猜?

大神,我好多提问都是你回答的,再问个问题呗,如果要在C#里设置字符数定长的string[]要怎么设置?比如:一个字符串数组有300个变量,每个字符串变量固定长度32个字符。
解决方案八:
C#里字符串是变长的,因为字符串变量是个引用类型在C++里,字符串和字符数组是可以通用的,C#不可以,但是可以用函数转换你可以定义长度为32的字符数组,然后把它转换成字符串
解决方案九:
引用7楼Z65443344的回复:

C#里字符串是变长的,因为字符串变量是个引用类型在C++里,字符串和字符数组是可以通用的,C#不可以,但是可以用函数转换你可以定义长度为32的字符数组,然后把它转换成字符串

你的意思是string[]st=newstring[32]{"123","234","555"……(32个)}然后把它变成字符串,这我会。我的意思是string[]st=newstring[300]{"123456……32",“123456……32”,……(300个32个字符的字符串)}

时间: 2025-01-21 13:07:05

读取PLC中的结构体时,总是提示:尝试读取或写入受保护的内存。这通常指示其他内存已损坏的相关文章

在类模版中typedef申明结构体时出错。

问题描述 在类模版中typedef申明结构体时出错. template struct Node { T value; Node* next; }; template typedef struct Node* ptLink; 这里用typedef申明一个模版结构体时报错 error C2823: typedef 模板 非法 error C2998: "Node *ptLink": 不能是模板定义 不知道错在哪里 求大神解答. 解决方案 template struct Node* ptLi

c++-Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数

问题描述 Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数 Visual Basic 6.0 读取一个C++编写的DLL中的结构体函数,几个函数公用一个内存有没有问题?需要复制内存么? 解决方案 http://blog.itpub.net/102086/viewspace-792251/

C++的结构体转换为C#的,尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述 各位大神们,我在C#中调用c++的dll提供的接口函数,函数中需要传递一个结构体dll中的函数接口是:ReadTag(HANDLEhHandle,REC_INFO&data);其中REC_INFO是一个结构体structREC_INFO{BYTEInfoType;union{//收集标签返回struct{BYTETagID[8];//BYTETagState;struct{BYTETagPower:2;BYTETagSensor:1;BYTETagInitialization:1;BY

C/C++中的结构体

什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 定义结构体使用struct修饰符,例如: struct test

c-C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么

问题描述 C 语言中返回结构体指针,结果出来了,但是还是出现错误,不知道为什么 解决方案 p 没有初始化,也就是没有分配空间.典型的指针错误,不初始化,指针指向哪里呢? 解决方案二: array *p = new array(); 解决方案三: array p;test(&p); 解决方案四: 当然,使用指针应该首先初始化一个空地址的,否则,很容易发生指针地址错误其次,看了一下你的程序设计,程序本身是定义了一个array的结构体变量,在主函数中却要申请一个指针变量p(它的类型是结构体),一系列操

OC中的结构体变量和结构体指针变量的区别

问题描述 OC中的结构体变量和结构体指针变量的区别 OC中的结构体变量和结构体指针变量的区别?,请写出相同点和不同点 解决方案 指向结构体变量的指针指向结构体变量的指针引用结构体变量中的成员结构体中的指针变量输出 解决方案二: 一般来说结构变量定义的时候就分配了内存空间;但结构体指针,和其它指针一样,只有4个字节的指针大小,在使用时需要先动态的分配内存.

C中的结构体对齐可以把下一个的类型补到前一个???

问题描述 C中的结构体对齐可以把下一个的类型补到前一个??? 解决方案 结构体对齐说的是编译器的事情,不是你定义一个字段然后自己去凑.千万不要从百度百科这种垃圾网站获得信息. 解决方案二: 同一类型的可以合并,很正常, 从对齐看,对其对齐要求是一样的,不冲突 实际上 char,char ,short 也可以合并成 一个int 当 char 8Bits,short16Bits,int32bits 的时候 只有当下个数据, 不在对齐位置的时候, 才会在两个数据中间插入间隙.

c-如何正确的导出动态库中的结构体变量

问题描述 如何正确的导出动态库中的结构体变量 使用开源库封装的dll,它里面的接口需要使用dll中定义的结构体变量作为参数,于是把该变量也一起导出了,但在使用时,对该变量取地址总返回未知的值.大概的代码如下: 头文件定义结构体A,并声明 a变量,另外有一个函数func struct A{}; extern const A a; int func(const A* p ); const A* return_a(); DLL中的 xxx.c文件中定义了a变量和func函数 const A a; in

c++-请问在C++中,结构体数组类型能作为类的数据成员吗?

问题描述 请问在C++中,结构体数组类型能作为类的数据成员吗? 我想让自己构造一个结构体数组来存储记录,结构体数组类型能作为类的数据成员吗? 解决方案 just do it 解决方案二: 可以.实现的时候注意不要出错就可以. 解决方案三: 可以,c++中结构体和类除了默认访问控制符外没什么区别,一个类的对象可以作为另外一个类的成员数据,结构体当然可以 解决方案四: 可以啊,结构体不过是扩展了的int float等等 解决方案五: 当然可以不过我觉得你还不如重新写个class作为专门存储数据 解决