2015-11-25 124 views
0

我试图用C++/CLI应用程序向西门子PLC写入内容。Snap7写入S7-1200 PLC

阅读是可以的(除了第一次读取它给出奇数值)。

但写作正在做一些完全不同于我想要的东西。

下面你可以找到代码:

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[];

我的问题是:

  • 请告诉我在C byte* buffer; ++和C#中的byte buffer[];之间的区别?
  • 当我在调试时将鼠标悬停在缓冲区上时,它说buffer* = 0 ''。这是否意味着它是空的?如果是这样,为什么它仍然发送随机数到我的PLC?

回答

1

什么在℃的byte* buffer; ++和C#中的byte buffer[];之间的差异?

假设你有typedef unsigned char byte;

在C++/CLI,byte* buffer;声明了一个buffer变量这是一个指向byte。在C#中,您将它写为:byte* buffer;unsafe上下文中。语法是相同的。

在C#中,byte[] buffer;声明了一个buffer变量,它是一个受管理的byte值的数组。 C++/CLI语法为array<byte> buffer;

请注意byte buffer[N];是用于本地数组的C++语法,它是而不是是同样的东西。那个可以衰减到byte*指针。

看起来您的代码使用本机内存缓冲区,但无法确定没有ReadDB的来源。

当我在调试时将鼠标悬停在缓冲区上时,它表示buffer* = 0 ''。这是否意味着它是空的?如果是这样,为什么它仍然发送随机数到我的PLC?

这意味着缓冲区中的第一个字节是0。如果缓冲区应该包含C字符串数据,则表示它包含空字符串。

上午我与缓冲区做错了什么吗?

最大的可能。但我不能确切地说出了什么问题,因为你没有发布ReadDB的来源。

有一对夫妇的红旗,但:

  • 什么是缓冲区的大小?您的代码不知道什么ReadDB回报,所以,你应该如何确保你不溢出呢?
  • 谁是缓冲的老板,意思是:谁是应该释放它?它想必生活在堆上,那么你的代码泄漏内存。如果它生存在ReadDB的堆栈上,则存在内存损坏问题。无论哪种方式,这段代码都是错误的。
+0

烨我发现我有我的缓冲更改为阵,我已经做到这一点,它现在解决了。谢谢(你的)信息! :) – Bart