Просмотр полной версии : Работа с регистрами
Здравствуйте. Возник вопрос:
Есть СОМ порт 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;
Не слишком понятно.
По Modbus считываем регистр, состоящий из 16ти бит, в этих 16битах зашиты 2 значения, а нам нужно считать не 16, а первые 8 бит. И вот как это реализовать?
Не слишком понятно.
По Modbus считываем регистр, состоящий из 16ти бит, в этих 16битах зашиты 2 значения, а нам нужно считать не 16, а первые 8 бит. И вот как это реализовать?
вернитесь к урокам информатики и вспомните
вернитесь к урокам информатики и вспомните
Ваш инфрмативный ответ очень помог, спасибо!
Евгений Кислов
25.12.2017, 09:46
Используйте ФБ UnpackWord из библиотеки CAA Memory.
krollcbas какой-то извращенный метод определять все 8 бит побитно да еще и с эльзами и ифами....
krollcbas
25.12.2017, 11:54
krollcbas какой-то извращенный метод определять все 8 бит побитно да еще и с эльзами и ифами....
Код получается компактным, легко модифицируемым и самодокументируемым.
Я не делаю как Вы и это значит извращение?
У каждого творческого человека (программиста) может существовать свой собственный стиль, лишь бы это приводило к желаемому результату.
Код получается компактным, легко модифицируемым и самодокументируемым.
Я не делаю как Вы и это значит извращение?
У каждого творческого человека (программиста) может существовать свой собственный стиль, лишь бы это приводило к желаемому результату.
наверное он хотел сказать, что требовалось получить сразу байт, а не через биты, обычного смещения и маски было бы достаточно
В третьем кодесисе операторы преобразования уже не работают?
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));
А не проще просто Pack - Unpack, В библиотеке standart или Util есть, не помню.
byte_1 := WORD_TO_BYTE( word ); - младшие 8 бит
byte_2 := WORD_TO_BYTE( SHR( word, 8 ) ); - старшие 8 бит
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot