Odebranie dwóch INT16

Temat wydawać by się mogło banalny. Mam licznik energii Legranda, który wysyła moc na dwóch rejestrach INT16. Należy go odebrać według instrukcji jako jeden rejestr ze znakiem.



Licznik pokazuje moc kiedy pobieram z plusem i kiedy oddaję do sieci z minusem.
I tu zaczyna się problem bo nijak nie mogę odebrać prawidłowej wartości mocy z minusem.

Przez analizator modbus wygląda to ok
convert_data2
czyli jedynka na MSB to minus i odczytana liczba, a Ja odbieram
obraz

Odbiór i konwersję robię na dwa sposoby

  - name: moc_L1
    unit_of_measurement: kW
    device_class: power
    slave: 10
    address: 20551
    count: 2
    input_type: input
    precision: 3
    scale: 0.00001
    data_type: int32

  - name: moc_L2
    unit_of_measurement: kW
    device_class: power
    slave: 10
    address: 20553
    count: 2
    input_type: input
    precision: 3
    scale: 0.00001
    data_type: custom
    structure: ">l"

ale i tak i tak jest źle, tylko co robię nie tak.

Trzeba policzyć

INT32 = rej1(INT16) * 65536 + rej2(INT16)

Dzięki za szybką sugestię.
Czyli muszę wykorzystać formułę temp value.
Ale niestety na wynik trzeba poczekać do rana aż słońce zaświeci :wink:

Dopisałeś gdy już odpowiedziałem.

Konfiguracja dla L1 powinna zrobić to automatycznie, dopisz dla “big endian” opcje swap: word

Muszę kontynuować temat.
Przesiadłem się na Node-Reda
mam taki flow


tylko teraz jak to sparsować te dwa INT
w buffer parser mam taki wpis

Tylko on traktuje to jako osobne liczby.
Dodam tylko tyle, że konfiguracja jako INT32 be nic nie daje. Wszelkie SWAPY także.

Edit:

co ciekawe jak zamaskowałem bit znaku to wartość wyświetla sie dobra


obraz
tylko brakuje minusa

Bez gotowego noda to już ani rusz… :slight_smile:

Możesz zrobić to za pomocą funkcji dla danych wyiściowych z noda modbus.


let val = msg.responseBuffer.buffer.readIntBE(0,4)
msg.payload = val *0.01;
return msg;

Swoją drogą to parsser bufer też by zadziałał gdybyś użył surowych danych msg.responseBuffer.buffer a nie payload

Z powodów osobistych musiałem zarzucić temat, ale wracam bo już długo wisi to w powietrzu.
Gdzie mam szukać opcji msg.responseBuffer.buffer ?
msg.response mam tylko payload i topic nie mam buffer ?