2015-11-25 120 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