Я пытаюсь написать что-то своему Siemens PLC с помощью приложения C++/CLI.Запись Snap7 на ПЛК S7-1200
Чтение в порядке (кроме первого раза, когда оно читается, оно дает нечетные значения).
Но письмо делает что-то совершенно иное, чем то, что я хочу.
ниже вы можете найти код:
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 ''
. Означает ли это, что это пусто? если да, то почему он по-прежнему отправляет случайные числа в мой ПЛК?
Е. Я заметил, что мне пришлось изменить свой буфер на массив, я сделал это, и он теперь решен. Спасибо за информацию! :) – Bart