Elektroda.pl
Elektroda.pl
X
PLC Fatek
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zero znaczące w rejestrze modbus Siemens s7 1200 1214C

neo_dc 13 Lut 2018 09:48 267 3
  • #1 13 Lut 2018 09:48
    neo_dc
    Poziom 32  

    Hej

    Jest sobie s7 1200, który zczytuje impulsy i wystawia to po modbusie w odpowiednich rejestrach (db). Impulsów będzie dużo (licznik), więc impulsy z jednego urządzenia rozbiłem na dwa rejestry modbusowe. Urządzenie odczytujące zczytuje sobie po dwa rejestry u składa z nich liczbę, np.:

    modbus[1] = 344
    modbus[2] = 992

    Składamy w 344992. Problem następuje gdy:
    modbus[1] = 344
    modbus[2] = 17

    Odczyt powinien wyglądać 344017, a wygląda 34417, co jest inną wartością. Oczywiście, mogę przenieść dodawanie tego zera na aplikację, ale chciałbym się dowiedzieć, czy można to jakoś elegancko rozwiązać po stronie PLC ?

    Pozdrawiam

    0 3
  • PLC Fatek
  • #2 13 Lut 2018 09:55
    Markos80

    Spec od PLC

    Czemu nie zapisujesz tych dwóch rejestrów jako DWORD?
    Nie wiem co jest pod drugiej stronie, ale na pewno też potrafi z dwóch słów zrobić jedno podwójne. Najwyżej będzie trzeba poobracać bajty, jeśli w urządzeniach jest różnica kodowania słów.

    0
  • PLC Fatek
  • #3 14 Lut 2018 16:36
    neo_dc
    Poziom 32  

    Hm, proszę o wyjaśnienie, nie jestem doświadczony.
    DWORD ma 32 bity, rejestr MODBUS ma 16 bitów, jak to tam upchać ?

    Program po drugiej stronie potrafi zrobić jedno podwójne słowo z dwóch, i to własnie robi, ale dodaje też to nieszczęsne zero, a chciałbym to zrobić bardziej "elegancko", żeby tego zera nie trzeba było dopisywać po drugiej stronie.

    0
  • #4 14 Lut 2018 16:45
    Markos80

    Spec od PLC

    Zakładając, że Modbus[1] i [2], mają adresy DBW0 i DBW2, możesz oba zapisać jako jeden DBD0, typu DWORD.
    "Samo" się rozbije na dwa rejestry po 16 bitów.
    Zobacz chociażby w kalkulatorze, jak wyglądają Twoje przykładowe liczby binarnie i szesnastkowo:
    10#344017 = 16#0005 3FD1 = 2#0000000000000101 0011111111010001
    W rozbiciu na dwa słowa:
    16#0005 = 10#5
    16#3FD1 = 10#16337
    Co do kodowania liczb zerknij chociażby do Kolejność bajtów.

    0