我试图用C++/CLI应用程序为我的西门子可编程序控制器编写一些东西。
阅读是可以的(除了第一次读它会给出奇怪的值)。
但是写作所做的事情与我想要的完全不同。
在下面您可以找到代码:
private: void WriteSiemensDB()
{
byte* buffer;
if (ConnectToSiemensPLC()) //Check if you are connected to PLC
{
String^ msg;
int DBNumber = 2;
bool NDR;
//Getting the values 1 time so buffer has a value
buffer = sPLC->ReadDB(DBNumber);
//give variables a value to write it to the PLC
NDR = true;
sPLC->SetBitAt(buffer, 0, 0, NDR); //Convert a bool to a bit
msg = sPLC->WriteDB(DBNumber, buffer); //write to the Datablock in Siemens
MessageBox::Show(msg); //Show if it worked or not
}
}sPLC->SetBitAt方法:
void SiemensPLC::SetBitAt(byte buffer[], int Pos, int Bit, bool Value)
{
byte Mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
if (Bit < 0) Bit = 0;
if (Bit > 7) Bit = 7;
if (Value)
{
buffer[Pos] = (byte)(buffer[Pos] | Mask[Bit]);
}
else
{
buffer[Pos] = (byte)(buffer[Pos] & ~Mask[Bit]);
}
}WriteDB方法:
System::String^ SiemensPLC::WriteDB(int DBnumber, byte buffer[])
{
int Result;
String^ msg;
Result = MyClient->DBWrite(DBnumber, 0, 80, buffer);
if (Result == 0)
{
msg = "Gelukt!"; //success
}
else
{
msg = "Mislukt, error:" + Result; //failed
}
return msg;
}我实际上收到了消息"Gelukt",但它仍然写入rwong值。所以填充我的buffer时出了点问题。我在缓冲区里做错什么了吗?
在C#中,除了缓冲区是byte buffer[];之外,我还有相同类型的应用程序。
我的问题是:
byte* buffer;在C++中和byte buffer[];在C#中有什么区别?buffer* = 0 ''。这意味着它是空的吗?如果是的话,它为什么还要向我的PLC发送随机数字呢?发布于 2015-11-25 23:33:56
byte* buffer;在C++中和byte buffer[];在C#中有什么区别?
假设你有typedef unsigned char byte;
在C++/CLI中,byte* buffer;声明一个buffer变量,它是指向byte的指针。在C#中,您可以在unsafe上下文中将其写为:byte* buffer;。语法是一样的。
在C#中,byte[] buffer;声明一个buffer变量,它是byte值的托管数组。C++/CLI语法是array<byte> buffer;。
注意,byte buffer[N];是本机数组的C++语法,这不是一回事。它可以衰减到byte*指针。
看起来您的代码使用了一个本机内存缓冲区,但是如果没有ReadDB的源代码,就无法确定这一点。
在调试时,当我在缓冲区上鼠标移动时,它会显示为
buffer* = 0 ''。这意味着它是空的吗?如果是的话,它为什么还要向我的PLC发送随机数字呢?
这意味着缓冲区中的第一个字节是0。如果缓冲区应该包含C字符串数据,则意味着它包含空字符串。
我在缓冲区里做错什么了吗?
很有可能。但我不能确切地说出出了什么问题,因为你没有发布ReadDB的来源。
不过,也有几个危险信号:
ReadDB返回了什么,那么您应该如何确保您没有溢出它呢?ReadDB的堆栈中,则会出现内存损坏问题。无论如何,该代码都是错误的。https://stackoverflow.com/questions/33919619
复制相似问题