чтение тега типа bool

Avatar
  • обновлен
имеем 1 word 2 байта по 8 бит каждый, с адресом 0
Там есть во втором байте бит ibSetDefSet.
как его считать по средствам modbus без скриптов (с возможностью записи)

Image 201
pic.JPG
Avatar
SIMP Tech (Сергей)
Добрый вечер.

имеем 1 word 2 байта по 8 бит каждый, с адресом 0
Там есть во втором байте бит ibSetDefSet.
как его считать по средствам modbus без скриптов (с возможностью записи)


Если не ошибаюсь, то считать можно только слово целиком. И без скрипта в данном случае не обойтись.
Avatar
vik
какой командой скрипта (паскаль, СИ) записать бит в слово?
Avatar
SIMP Tech (Сергей)
День добрый.

какой командой скрипта (паскаль, СИ) записать бит в слово?

examplebit_2016-04-01.zip
Avatar
vik
а как опросить виртуальные каналы типа boolean и записать из них слово word
наваял примерно такое, но не работает.
[spoiler]{Пример Pascal Script} var b0,b1,b2,b3,b4,b5,b6,b7: boolean; Var Out,: Integer; Begin B7:=ReadValue('bit_(7)'); B6:=ReadValue('bit_(6)'); B5:=ReadValue('bit_(5)'); B4:=ReadValue('bit_(4)'); B3:=ReadValue('bit_(3)'); B2:=ReadValue('bit_(2)'); B1:=ReadValue('bit_(1)'); B0:=ReadValue('bit_(0)'); out:= BinToWord('B7'); out:= out*2+BinToWord('B6'); out:= out*2+BinToWord('B5'); out:= out*2+BinToWord('B4'); out:= out*2+BinToWord('B3'); out:= out*2+BinToWord('B2'); out:= out*2+BinToWord('B1'); out:= out*2+BinToWord('B0'); WriteValue('outword',out); end.[/spoiler]
Avatar
SIMP Tech (Сергей)
День добрый.

а как опросить виртуальные каналы типа boolean и записать из них слово word
наваял примерно такое, но не работает.

{Пример Pascal Script}
var b0,b1,b2,b3,b4,b5,b6,b7: boolean;
Var Out,: Integer;
Begin

B7:=ReadValue('bit_(7)');
B6:=ReadValue('bit_(6)');
B5:=ReadValue('bit_(5)');
B4:=ReadValue('bit_(4)');
B3:=ReadValue('bit_(3)');
B2:=ReadValue('bit_(2)');
B1:=ReadValue('bit_(1)');
B0:=ReadValue('bit_(0)');

out:= BinToWord('B7');
out:= out*2+BinToWord('B6');
out:= out*2+BinToWord('B5');
out:= out*2+BinToWord('B4');
out:= out*2+BinToWord('B3');
out:= out*2+BinToWord('B2');
out:= out*2+BinToWord('B1');
out:= out*2+BinToWord('B0');
WriteValue('outword',out);

end.

Смотрим документацию:

function BinToWord(ABin: String): Word (функция преобразует входное значение ABin строкового типа
в десятичное значение. Пример ABin = '01001001' , результат = 73)
В качестве параметра в функцию передается строка, в Вашем случае Вы отдаете out:= BinToWord('B7') строку вида "В7", поэтому и не работает. Нужно сделать примерно так:
var b0,b1,b2,b3,b4,b5,b6,b7: integer;

str := IntToStr(b7) + … IntToStr(b0);
out:= BinToWord(str);
Avatar
vik
Работает, спасибо.
вот рабочий код, может кому пригодится.
[spoiler]{объявляем переменные} var b0,b1,b2,b3,b4,b5,b6,b7:int; var Out: word; var str: string; Begin {опрашиваем все биты и присваиваем промежуточным переменным} B7:=ReadValue('bit_(7)'); B6:=ReadValue('bit_(6)'); B5:=ReadValue('bit_(5)'); B4:=ReadValue('bit_(4)'); B3:=ReadValue('bit_(3)'); B2:=ReadValue('bit_(2)'); B1:=ReadValue('bit_(1)'); B0:=ReadValue('bit_(0)'); {набираем стринг из 0 и 1} str:=IntToStr(b7)+IntToStr(b6)+IntToStr(b5)+IntToStr(b4)+IntToStr(b3)+IntToStr(b2)+IntToStr(b1)+IntToStr(b0); {конвертируем стринг из нолей и единиц в ворд} out:= BinToWord(str); {записываем результат} WriteValue('outword',out); end.[/spoiler]