PDA

Просмотр полной версии : Работа с регистрами



REOLINE
24.12.2017, 22:58
Здравствуйте. Возник вопрос:
Есть СОМ порт 2 - мастер, протокол Modbus-RTU на СПК-107, к нему подключены 2 частотника ПЧ. Считываем в WORD-переменную один из регистров, в этом регистре зашиты первые 8бит это одно значение, вторые 8бит это другое значение.
Как выделить из регистра только первые 8бит в переменную типа BYTE ?

krollcbas
25.12.2017, 02:46
Our_Word:=Our_Word;(*Это наше слово*)
(*Разбиваем его побитно*)
IF (Our_Word AND 1)<>0 THEN bit_0:=TRUE; ELSE bit_0:=FALSE; END_IF;
IF (Our_Word AND 2)<>0 THEN bit_1:=TRUE; ELSE bit_1:=FALSE; END_IF;
IF (Our_Word AND 4)<>0 THEN bit_2:=TRUE; ELSE bit_2:=FALSE; END_IF;
IF (Our_Word AND 8)<>0 THEN bit_3:=TRUE; ELSE bit_3:=FALSE; END_IF;
и т д
Our_BYTE:=Our_BYTE;(*Это наш байт*)
(*Зашиваем наши биты в наш байт*)
Our_BYTE:=0;(*Обнуляем чтоб сам сбрасывался в 0, когда нет выполнения условий*)
IF bit_0 THEN Our_BYTE:=Our_BYTE OR 1; END_IF;
IF bit_1 THEN Our_BYTE:=Our_BYTE OR 2; END_IF;
IF bit_2 THEN Our_BYTE:=Our_BYTE OR 4; END_IF;
IF bit_3 THEN Our_BYTE:=Our_BYTE OR 8; END_IF;

REOLINE
25.12.2017, 07:20
Не слишком понятно.

По Modbus считываем регистр, состоящий из 16ти бит, в этих 16битах зашиты 2 значения, а нам нужно считать не 16, а первые 8 бит. И вот как это реализовать?

capzap
25.12.2017, 07:28
Не слишком понятно.

По Modbus считываем регистр, состоящий из 16ти бит, в этих 16битах зашиты 2 значения, а нам нужно считать не 16, а первые 8 бит. И вот как это реализовать?

вернитесь к урокам информатики и вспомните

REOLINE
25.12.2017, 07:31
вернитесь к урокам информатики и вспомните

Ваш инфрмативный ответ очень помог, спасибо!

Евгений Кислов
25.12.2017, 09:46
Используйте ФБ UnpackWord из библиотеки CAA Memory.

melky
25.12.2017, 10:32
krollcbas какой-то извращенный метод определять все 8 бит побитно да еще и с эльзами и ифами....

krollcbas
25.12.2017, 11:54
krollcbas какой-то извращенный метод определять все 8 бит побитно да еще и с эльзами и ифами....
Код получается компактным, легко модифицируемым и самодокументируемым.
Я не делаю как Вы и это значит извращение?
У каждого творческого человека (программиста) может существовать свой собственный стиль, лишь бы это приводило к желаемому результату.

capzap
25.12.2017, 12:28
Код получается компактным, легко модифицируемым и самодокументируемым.
Я не делаю как Вы и это значит извращение?
У каждого творческого человека (программиста) может существовать свой собственный стиль, лишь бы это приводило к желаемому результату.

наверное он хотел сказать, что требовалось получить сразу байт, а не через биты, обычного смещения и маски было бы достаточно

petera
25.12.2017, 22:03
В третьем кодесисе операторы преобразования уже не работают?

VAR
LoBYTE: BYTE;
WordVal: WORD;
END_VAR

LoBYTE:= WORD_TO_BYTE(WordVal);

ЗЫ
Ну, и старший байт слова

VAR
LoBYTE, HiBYTE: BYTE;
WordVal: WORD;
END_VAR

LoBYTE:= WORD_TO_BYTE(WordVal);
HiBYTE:= WORD_TO_BYTE(SHR(WordVal,8));

Сема
27.12.2017, 14:42
А не проще просто Pack - Unpack, В библиотеке standart или Util есть, не помню.

lazy
10.01.2018, 10:01
byte_1 := WORD_TO_BYTE( word ); - младшие 8 бит
byte_2 := WORD_TO_BYTE( SHR( word, 8 ) ); - старшие 8 бит