Страница 1 из 1

Модбас

Добавлено: 18 фев 2017, 22:22
nalnik
Помогите! Давно писал про ЭТО - помогите, Замучился постоянно заниматся мазахизиом.

Подскажите что можно сделать что бы при передачи и приеме по Модбас
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 я не могу применить с другими устройствами
в одной сети.

Модбас

Добавлено: 20 фев 2017, 09:18
holodaleksey
плюсую, необходима настройка модбаса.

Модбас

Добавлено: 20 фев 2017, 09:27
Boroda
Порядок байт где-то уже обсуждался, Сергей участвовал в этом. Но почему-то дальше не пошло...

Модбас

Добавлено: 20 фев 2017, 11:58
holodaleksey
офтоп: с утра ранг темы был =2, сейчас = Rank: 2376
нипарядак...

Модбас

Добавлено: 20 фев 2017, 13:45
Boroda
holodaleksey писал(а):нипарядак...
эт я шалю

Модбас

Добавлено: 20 фев 2017, 14:40
holodaleksey
да ладно?! )))

Модбас

Добавлено: 20 фев 2017, 14:49
Boroda
holodaleksey писал(а):да ладно?!
Больше помощи сайту - больше плюсиков.

Модбас

Добавлено: 21 фев 2017, 21:05
golowa70
Тоже актуально +

Добавлено (21.02.2017, 21:05)
---------------------------------------------
nalnik писал(а):После компиляции в этой части меняю W2 на W1, а W1 на W2
Тоже актуально + . Но у меня даже по вашему методу  не хочет писать INT32

Модбас

Добавлено: 26 фев 2017, 15:21
Max
Намучился я с этим ModBas в новой версии программы.... Вылетает и все. Без явной причины. Пользовался портативной версией программы. Прикрепляю лог программы.

Вернулся к версии 2.1.1 по стабильнее версия...

И еще, эта новая IDE сжирает память "мама не горюй" на ней вообще некоторые проекты сомнительно сделать, особенно с развитым меню и МодБасом....