PDA

Просмотр полной версии : MasterSCADA 4D INT_TO_BITS



nikolay861
19.12.2023, 16:53
Всем привет, нужно сделать преобразование INT в 16 BITS, т.е. блок должен быть типа INT_TO_BITS, в сигнетикс есть такой блок, и человек что делал программу для шкафа его успешно использовал и теперь мне нужно в скаде как то это обратно разложить, но такого блока как INT_TO_BITS нет, есть только BYTE_TO_BITS, так же есть на форуме не рабочая ссылка на DWORD_TO_BITS.
Я могу это сделать через C#, как пример

int val = 1;
string binary = Convert.ToString(val, 2);
Console.WriteLine(binary);
но я на выходе получу 11111111111111111111111111111111, т.е. как мне потом из этого выковыривать статус, это какойто обработчик нужен будет.
Можно и так попробывать

int number;
byte[] bytes = BitConverter.GetBytes(number);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
Из массива проверять значение.
Может есть какие то другие варианты, свою программу чел переделывать не будет.

1exan
19.12.2023, 18:08
Всем привет, нужно сделать преобразование INT в 16 BITS, т.е. блок должен быть типа INT_TO_BITS, в сигнетикс есть такой блок, и человек что делал программу для шкафа его успешно использовал и теперь мне нужно в скаде как то это обратно разложить, но такого блока как INT_TO_BITS нет, есть только BYTE_TO_BITS, так же есть на форуме не рабочая ссылка на DWORD_TO_BITS.
Я могу это сделать через C#, как пример

int val = 1;
string binary = Convert.ToString(val, 2);
Console.WriteLine(binary);
но я на выходе получу 11111111111111111111111111111111, т.е. как мне потом из этого выковыривать статус, это какойто обработчик нужен будет.
Можно и так попробывать

int number;
byte[] bytes = BitConverter.GetBytes(number);
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
Из массива проверять значение.
Может есть какие то другие варианты, свою программу чел переделывать не будет.

Посмотрите блок GetBit или вообще напишите свой блок на ST, читая биты входного слова через точку: bBit0 := wIn.0; и т.д.

nikolay861
19.12.2023, 20:54
Посмотрите блок GetBit или вообще напишите свой блок на ST, читая биты входного слова через точку: bBit0 := wIn.0; и т.д.

Если честно, я ST вообще не понимаю, c# я просто хорошо знаю, и был очень рад что в мастерскаде он есть, а то мне было бы совсем плохо, так же я и фбд юзаю конечно же, потому что как и лд, все контролеры на них программируются, но в мастерскаде фбд очень ущербный.

kondor3000
19.12.2023, 22:00
Если честно, я ST вообще не понимаю, c# я просто хорошо знаю, и был очень рад что в мастерскаде он есть, а то мне было бы совсем плохо, так же я и фбд юзаю конечно же, потому что как и лд, все контролеры на них программируются, но в мастерскаде фбд очень ущербный.

Там знать нечего, например есть переменная типа WORD (UINT) с именем Mask, чтобы распаковать 0 бит (типа BOOL) пишите b0:=Mask.0;
бит 1 пишите b1:=Mask.1;
бит 2- пишите b2:=Mask.2; и т. д. до бит 15

Можно писать в одну строку
b0:=Mask.0; b1:=Mask.1; b2:=Mask.2; b3:=Mask.3; ....... b15:=Mask.15;

nikolay861
20.12.2023, 14:48
Там знать нечего, например есть переменная типа WORD (UINT) с именем Mask, чтобы распаковать 0 бит (типа BOOL) пишите b0:=Mask.0;
бит 1 пишите b1:=Mask.1;
бит 2- пишите b2:=Mask.2; и т. д. до бит 15

Можно писать в одну строку
b0:=Mask.0; b1:=Mask.1; b2:=Mask.2; b3:=Mask.3; ....... b15:=Mask.15;

Хорошо, спасибо, попробую.