Float -- Unsiged long Integer

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Аватара пользователя
nalnik
Подполковник
Сообщения: 1262
Зарегистрирован: 14.05.2016{, 17:12}
Репутация: 93
Откуда: Кисловодск
Имя: Александр

Float -- Unsiged long Integer

#1

Сообщение nalnik » 18.02.2017{, 21:54}

Добрый день. Давно писал про ЭТО - помогите, Замучился постоянно заниматся мазахизиом.

Подскажите что можно сделать что бы при передачи и приеме по Модбас
Float и Unsiged long Integer байты уходили и приходили в "другом" порядке?
Проблема в том что у меня в сети работают еще десяток ПЛК150 (Овен) и все это уходит на сенсорную панель в которой я не могу отдельно на каждое устройство указать порядок байт.
(Arduino хочу использовать для замены сдохших ПЛК150).

Я делаю так:
После компиляции в этой части меняю W2 на W1, а W1 на W2

struct _savTWstr _saveFloatToModbus( float value)
{ _savTWstr result;

byte b;
b=*(((byte*)&value) + 0 );
for(byte i = 0; i < 8; i++) bitWrite(result.w2,i,bitRead(b, i));
b=*(((byte*)&value) + 1 );
for(byte i = 0; i < 8; i++) bitWrite(result.w2,i+8, bitRead(b, i));
b=*(((byte*)&value) + 2 );
for(byte i = 0; i < 8; i++) bitWrite(result.w1,i,bitRead(b, i));
b=*(((byte*)&value) + 3 );
for(byte i = 0; i < 8; i++) bitWrite(result.w1,i+8,bitRead(b, i));
return result ;}
struct _savTWstr _saveUnsignedLongTypeToModbus( unsigned long value)
{ _savTWstr result;
for(byte i = 0; i < 16; i++) bitWrite(result.w2,i,bitRead(value, i));
for(byte i = 16; i < 32; i++) bitWrite(result.w1,(i-16),bitRead(value, i));
return result ;}
float _readFloatFromModbus(uint16_t w1, uint16_t w2)
{
byte b[4];
for(byte i = 0; i < 8; i++) bitWrite(b[0],i,bitRead(w2, i));
for(byte i = 0; i < 8; i++) bitWrite(b[1],i,bitRead(w2,(i+8)));
for(byte i = 0; i < 8; i++) bitWrite(b[2],i,bitRead(w1, i));
for(byte i = 0; i < 8; i++) bitWrite(b[3],i,bitRead(w1,(i+8)));
return *((float *)&b);
}
unsigned long _readUnsignedLongTypeFromModbus(uint16_t w1, uint16_t w2)
{
unsigned long result;
for(byte i = 0; i < 16; i++) bitWrite(result,i,bitRead(w2, i));
for(byte i = 16; i < 32; i++) bitWrite(result,i,bitRead(w1,(i-16)));
return result;
}

потом зашиваю. После этого работает нормально.
Может в FLProg есть где то "волшебная кнопка" чтоб указать порядок байт?
Кнопка эта очень нужна - такие же проблемы и со всеми  PLC Delta
получается что Arduino я не могу применить с другими устройствами
в одной сети.
Последний раз редактировалось nalnik 18.02.2017{, 22:13}, всего редактировалось 1 раз.
Я хочу быть добрее, но люди сами нарываются.

golowa70
Сержант
Сообщения: 195
Зарегистрирован: 20.02.2016{, 00:05}
Репутация: 5

Float -- Unsiged long Integer

#2

Сообщение golowa70 » 25.02.2017{, 01:34}

Ага, +++
Может третий раз тему открыть

Ответить

Вернуться в «Спросить у знатоков»