Изпращане на 0xFF и изчисляване на CRC със подписани байтове - WriteSingleCoil & ModBUS & Java & Android -

РЕДАКТИРАНО И ПРОВЕДЕНО (по-долу)

Използвам Java за Android, опитвайки се да изпратя байта 255 (0xFF във функцията WriteSingleCoil) към ModBUS сървърно устройство.

Устройството не работи, не знам дали защото не мога да интерпретира подписания байт -1 или защото греша при изчисляването на CRC. Не знам как да изчисля CRC за отрицателни байтове.

Обобщаване: Не знам как да изпратя функция 05 Write Single Coil със стойност 0xFF за включване на бобината за от Java към ModBUS сървър.

Може ли някой да ми помогне, моля?

РЕШЕНИЕ:

" iIndex = ucCRCLo ^ b: операции като тази трябва да бъдат записани като iIndex = (ucCRCLo ^ b)&0xff, тъй като & ще прехвърли ucCRCLo, b и резултата към int, което е 32 бита, докато short е 16, така че ще имате много допълнителни битове, зададени на 1 "

Този отговор ми помогна. Благодаря много на TheDayOfcondor

Но също така моят огромен проблем беше обичайният проблем в Java със подписани байтове. Моята функция за изчисляване на CRC го прави правилно за неподписани байтове, но дава грешки, ако премина вътре в подписани байтове. Номерът за работа с байтове за ModBUS комуникация е работата в цялото приложение с шорти като байтове, за да има диапазон 0-255, дори изчисляване на трамвай и CRC. И само в последната стъпка, когато изпращате трамвай към ModBUS сървъра, отново ги преобразувайте в байтове. Това работи.

Надяваме се, че ще помогне на някого в бъдеще.

ОБЯСНЕНИЕ НА ПРОБЛЕМА:

Опитвам се да настроя бобина на ModBUS с функция 05, това е обяснение на функцията:

Заявка

Опитвам се да настроя бобината на адрес 1:

Този шестнадесетичен: 0A 05 00 01 ff 00 DC 81

Този масив от байтове: 10 5 0 1 255 0 220 129

10: Адресът на подчинения (10 = 0A шестнадесетичен)

05: Функционалният код (принудителна единична намотка)

0001: Адресът на данните на бобината. (бобина № 1 = 01 шестнадесетичен)

FF00: Състоянието за запис (FF00 = ВКЛ., 0000 = ИЗКЛ.)

DC81: CRC (циклична проверка на излишък) за проверка на грешки.

Работата е там, че Java използва байтове със знак, така че не мога да сложа 255 в моя масив от байтове. Разбирам, че трябва да поставя -1, но тогава не мога да изчисля CRC правилно, защото имам няколко предварително изчислени масива от байтове за получаване на CRC, но функцията изпраща отрицателен индекс.

И така: не знам дали се справям правилно, опитвайки се да изпратя -1, дали имам алтернатива за изпращане на 255, нито как да изчисля CRC за -1.

Това е функция за изчисляване на CRC:

public short[] GenerateCRC (byte[] pMsg) {
    short ucCRCHi = 0xFF;
    short ucCRCLo = 0xFF;
    int iIndex;

    for (byte b : pMsg)
    {
        iIndex = ucCRCLo ^ b;

        try {
            ucCRCLo = (short)(ucCRCHi ^ aucCRCHi[ ( iIndex ) ]);
            ucCRCHi = aucCRCLo[ ( iIndex ) ];
        } catch (Exception e) {
            Log.e(LOGTAG, "GenerateCRC: " + e.toString(), e);
            e.printStackTrace();
        }
    }

        short[]result= new short[2];
        result0]= ucCRCHi;
        result1]= ucCRCLo;

        return result;
}

person Esinor I.D.    schedule 05.11.2012    source източник


Отговори (1)


Въпросът не е много ясен - обаче най-често срещаният проблем при работа с байтове е фактът, че Java няма неподписани байтове и булевата операция винаги е между int

Най-добрият начин да се справите с байтовете е да използвате цели числа и да изпълнявате всяка операция с 0xff. Използвайте също >>> за смяна надясно (това е версията без знак)

Пример:

byte b= (byte)(255 & 0xff) // дава ви "неподписан байт"

байт b= (байт) ((b‹‹2)0xff ) // отместване наляво трябва да бъде съкратено

Ако публикувате вашия код за изчисляване на CRC, мога да го разгледам

Най-добрият начин за дефиниране на масив от байтове без използване на отрицателни числа е като този:

byte[]={ (byte)0xff, (byte)0xff, (byte)0xff };
person thedayofcondor    schedule 05.11.2012
comment
здрасти Благодаря много за помощта. И съжалявам, че не съм толкова ясен, ще се опитам да обясня подробно. Редактирах публикацията, за да дам повече информация. - person Esinor I.D.; 05.11.2012
comment
iIndex = ucCRCLo ^ b: операции като тази трябва да бъдат записани като iIndex = (ucCRCLo ^ b)&0xff, защото & ще прехвърли ucCRCLo, b и резултата към int, което е 32 бита, докато short е 16, така че ще имате много допълнителни битове, зададени на 1 - person thedayofcondor; 05.11.2012
comment
Добре! Благодаря отново за помощта. Функцията за изчисляване на CRC работи, но все още не получавам успех в комуникацията с ModBUS сървъра. Но мисля, че проблемът е вътре в сървъра, не може да управлява подписани байтове. Така че ще потърся алтернатива за задаване на стойности ON. Благодаря много. - person Esinor I.D.; 05.11.2012
comment
Как комуникирате с MODBus устройството? Сериен, мрежов или какво? Имате ли работещ софтуер, за да комуникирате с него? Ако да, има много налични инструменти за смъркане - person thedayofcondor; 05.11.2012
comment
Разработвам нов софтуер, свързващ се чрез TCP. За тестване изпращам изчислените масиви от байтове с помощта на Hercules и нямам отговор, когато изпращам отрицателни байтове, така че предполагам, че сървърът не ги управлява. Търся алтернатива, ще се опитам да използвам друга функция на ModBUS, WriteMultipleCoils, за да ги настроя всички заедно, надявайки се, че няма нужда от отрицателни байтове. - person Esinor I.D.; 05.11.2012
comment
здравей момче! Реших глупавия си проблем. Това беше обичайният проблем в Java със подписани байтове. Моята функция за изчисляване на CRC го прави правилно за неподписани байтове, но дава грешки, ако премина вътре в подписани байтове. Номерът за работа с байтове за ModBUS комуникация е работата в цялото приложение с шорти като байтове, за да има диапазон 0-255, дори изчисляване на трамваи и CRC. И само в последната стъпка, когато изпращате трамвай към ModBUS сървъра, отново ги преобразувайте в байтове. Това работи. Благодаря много за вашата помощ, беше наистина полезно; Благодаря. - person Esinor I.D.; 09.11.2012
comment
Вие сте добре дошъл! Мога да разбера колко е разочароващо - използвам Java, за да взаимодействам с множество устройства от ниско ниво и го навлякох! - person thedayofcondor; 09.11.2012