FLProg
Вход на сайт
Логин:
Пароль:
Поиск
Мы в VK
...
Статистика


Яндекс.Метрика
Понедельник, 27.02.2017, 16:42
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » Float -- Unsiged long Integer (байты)
Float -- Unsiged long Integer
nalnik
Дата: Суббота, 18.02.2017, 21:54 | Сообщение # 1
Майор
Группа: Проверенные
Сообщений: 128
Награды: 2
Репутация: 0
Статус: Offline
Добрый день. Давно писал про ЭТО - помогите, Замучился постоянно заниматся мазахизиом.

Подскажите что можно сделать что бы при передачи и приеме по Модбас
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
 
golowa70 Дата: Суббота, 25.02.2017, 01:34 | Сообщение # 2
Сержант
Группа: Проверенные
Сообщений: 57
Награды: 0
Репутация: 0
Статус: Offline
Ага, +++
Может третий раз тему открыть
 
Форум » Основной » Спросить у знатоков » Float -- Unsiged long Integer (байты)
Страница 1 из 11
Поиск:

FLProg © 2017
Яндекс.Метрика