[{"data":1,"prerenderedAt":2435},["ShallowReactive",2],{"blog-en-/en/blog/gdt-hmi-integration-modbus-weight-display":3},{"id":4,"title":5,"body":6,"description":2420,"extension":2421,"meta":2422,"navigation":314,"path":2431,"seo":2432,"stem":2433,"__hash__":2434},"en_blog/en/blog/gdt-hmi-integration-modbus-weight-display.md","GDT + HMI Integration: Real-Time Weight Display with Modbus Communication",{"type":7,"value":8,"toc":2403},"minimark",[9,14,46,49,53,64,68,272,276,281,288,594,601,1156,1160,1167,2197,2201,2205,2208,2213,2235,2239,2244,2297,2301,2317,2323,2326,2338,2342,2349,2375,2379,2399],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17,18,22,23,26,27,32,33,37,38,41,42,45],"p",{},"In industrial weighing systems, ",[19,20,21],"strong",{},"real-time weight display"," and ",[19,24,25],{},"recording"," are critical requirements. Our ",[28,29,31],"a",{"href":30},"/en/products/gdt-digital-transmitter","GDT Digital Transmitter"," communicates with ",[28,34,36],{"href":35},"/en/solutions/hmi-industrial-display-solutions","HMI Industrial Display Solutions"," via ",[19,39,40],{},"Modbus TCP"," or ",[19,43,44],{},"Modbus RTU"," protocol to meet these needs.",[15,47,48],{},"In this article, we examine in detail how to read, display, and record weight data from GDT on an HMI panel.",[10,50,52],{"id":51},"system-architecture","System Architecture",[54,55,60],"pre",{"className":56,"code":58,"language":59},[57],"language-text","┌──────────────────────────────────────────────────────┐\n│         Loadcell Platform (4-channel)                │\n│                                                      │\n│  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐   │\n│  │LC #1   │  │LC #2   │  │LC #3   │  │LC #4   │   │\n│  │2mV/V   │  │2mV/V   │  │2mV/V   │  │2mV/V   │   │\n│  └───┬────┘  └───┬────┘  └───┬────┘  └───┬────┘   │\n│      │           │           │           │        │\n└──────┼───────────┼───────────┼───────────┼────────┘\n       │           │           │           │\n       └───────────┴───────────┴───────────┘\n                     │\n              ┌──────▼──────┐\n              │  GDT-410M   │  ← 24-bit ADC, Modbus TCP\n              │  Transmitter│\n              └──────┬──────┘\n                     │ Ethernet (Modbus TCP)\n                     │ Port 502\n              ┌──────▼──────┐\n              │  HMI Panel  │  ← 10.1\" Touchscreen\n              │  Qt/QML UI  │     Embedded Linux\n              └─────────────┘\n","text",[61,62,58],"code",{"__ignoreMap":63},"",[10,65,67],{"id":66},"gdt-modbus-register-map","GDT Modbus Register Map",[69,70,71,93],"table",{},[72,73,74],"thead",{},[75,76,77,81,84,87,90],"tr",{},[78,79,80],"th",{},"Register",[78,82,83],{},"Address",[78,85,86],{},"Type",[78,88,89],{},"Unit",[78,91,92],{},"Description",[94,95,96,116,133,150,168,185,202,219,238,255],"tbody",{},[75,97,98,104,107,110,113],{},[99,100,101],"td",{},[19,102,103],{},"Gross Weight",[99,105,106],{},"40001-40002",[99,108,109],{},"Float32",[99,111,112],{},"kg",[99,114,115],{},"Total weight (4 channels)",[75,117,118,123,126,128,130],{},[99,119,120],{},[19,121,122],{},"Net Weight",[99,124,125],{},"40003-40004",[99,127,109],{},[99,129,112],{},[99,131,132],{},"Gross - Tare",[75,134,135,140,143,145,147],{},[99,136,137],{},[19,138,139],{},"Tare Value",[99,141,142],{},"40005-40006",[99,144,109],{},[99,146,112],{},[99,148,149],{},"Container weight",[75,151,152,157,160,162,165],{},[99,153,154],{},[19,155,156],{},"Channel 1",[99,158,159],{},"40011-40012",[99,161,109],{},[99,163,164],{},"mV/V",[99,166,167],{},"Loadcell 1 raw data",[75,169,170,175,178,180,182],{},[99,171,172],{},[19,173,174],{},"Channel 2",[99,176,177],{},"40013-40014",[99,179,109],{},[99,181,164],{},[99,183,184],{},"Loadcell 2 raw data",[75,186,187,192,195,197,199],{},[99,188,189],{},[19,190,191],{},"Channel 3",[99,193,194],{},"40015-40016",[99,196,109],{},[99,198,164],{},[99,200,201],{},"Loadcell 3 raw data",[75,203,204,209,212,214,216],{},[99,205,206],{},[19,207,208],{},"Channel 4",[99,210,211],{},"40017-40018",[99,213,109],{},[99,215,164],{},[99,217,218],{},"Loadcell 4 raw data",[75,220,221,226,229,232,235],{},[99,222,223],{},[19,224,225],{},"Status",[99,227,228],{},"40101",[99,230,231],{},"Uint16",[99,233,234],{},"-",[99,236,237],{},"Device status",[75,239,240,245,248,250,252],{},[99,241,242],{},[19,243,244],{},"Zero Command",[99,246,247],{},"40201",[99,249,231],{},[99,251,234],{},[99,253,254],{},"Write 1 = Zero",[75,256,257,262,265,267,269],{},[99,258,259],{},[19,260,261],{},"Tare Command",[99,263,264],{},"40202",[99,266,231],{},[99,268,234],{},[99,270,271],{},"Write 1 = Tare",[10,273,275],{"id":274},"hmi-application-qt-qml-interface","HMI Application: Qt + QML Interface",[277,278,280],"h3",{"id":279},"c-modbus-backend","C++ Modbus Backend",[15,282,283],{},[19,284,285],{},[61,286,287],{},"ModbusReader.h",[54,289,293],{"className":290,"code":291,"language":292,"meta":63,"style":63},"language-cpp shiki shiki-themes github-light github-dark","#ifndef MODBUSREADER_H\n#define MODBUSREADER_H\n\n#include \u003CQObject>\n#include \u003CQModbusTcpClient>\n#include \u003CQTimer>\n\nclass ModbusReader : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(float grossWeight READ grossWeight NOTIFY weightChanged)\n    Q_PROPERTY(float netWeight READ netWeight NOTIFY weightChanged)\n    Q_PROPERTY(float tare READ tare NOTIFY weightChanged)\n    Q_PROPERTY(bool connected READ connected NOTIFY connectionChanged)\n\npublic:\n    explicit ModbusReader(QObject *parent = nullptr);\n    ~ModbusReader();\n\n    float grossWeight() const { return m_grossWeight; }\n    float netWeight() const { return m_netWeight; }\n    float tare() const { return m_tare; }\n    bool connected() const { return m_connected; }\n\n    Q_INVOKABLE void connectToDevice(const QString &ip, int port = 502);\n    Q_INVOKABLE void zero();\n    Q_INVOKABLE void setTare();\n\nsignals:\n    void weightChanged();\n    void connectionChanged();\n    void errorOccurred(const QString &error);\n\nprivate slots:\n    void onStateChanged(QModbusDevice::State state);\n    void onReadReady();\n    void readRegisters();\n\nprivate:\n    QModbusTcpClient *m_modbusClient;\n    QTimer *m_readTimer;\n\n    float m_grossWeight = 0.0f;\n    float m_netWeight = 0.0f;\n    float m_tare = 0.0f;\n    bool m_connected = false;\n\n    float registersToFloat(quint16 reg1, quint16 reg2);\n};\n\n#endif\n","cpp",[61,294,295,303,309,316,322,328,334,339,345,351,357,363,369,375,381,386,392,398,404,409,415,421,427,433,438,444,450,456,461,467,473,479,485,490,496,502,508,514,519,525,531,537,542,548,554,560,566,571,577,583,588],{"__ignoreMap":63},[296,297,300],"span",{"class":298,"line":299},"line",1,[296,301,302],{},"#ifndef MODBUSREADER_H\n",[296,304,306],{"class":298,"line":305},2,[296,307,308],{},"#define MODBUSREADER_H\n",[296,310,312],{"class":298,"line":311},3,[296,313,315],{"emptyLinePlaceholder":314},true,"\n",[296,317,319],{"class":298,"line":318},4,[296,320,321],{},"#include \u003CQObject>\n",[296,323,325],{"class":298,"line":324},5,[296,326,327],{},"#include \u003CQModbusTcpClient>\n",[296,329,331],{"class":298,"line":330},6,[296,332,333],{},"#include \u003CQTimer>\n",[296,335,337],{"class":298,"line":336},7,[296,338,315],{"emptyLinePlaceholder":314},[296,340,342],{"class":298,"line":341},8,[296,343,344],{},"class ModbusReader : public QObject\n",[296,346,348],{"class":298,"line":347},9,[296,349,350],{},"{\n",[296,352,354],{"class":298,"line":353},10,[296,355,356],{},"    Q_OBJECT\n",[296,358,360],{"class":298,"line":359},11,[296,361,362],{},"    Q_PROPERTY(float grossWeight READ grossWeight NOTIFY weightChanged)\n",[296,364,366],{"class":298,"line":365},12,[296,367,368],{},"    Q_PROPERTY(float netWeight READ netWeight NOTIFY weightChanged)\n",[296,370,372],{"class":298,"line":371},13,[296,373,374],{},"    Q_PROPERTY(float tare READ tare NOTIFY weightChanged)\n",[296,376,378],{"class":298,"line":377},14,[296,379,380],{},"    Q_PROPERTY(bool connected READ connected NOTIFY connectionChanged)\n",[296,382,384],{"class":298,"line":383},15,[296,385,315],{"emptyLinePlaceholder":314},[296,387,389],{"class":298,"line":388},16,[296,390,391],{},"public:\n",[296,393,395],{"class":298,"line":394},17,[296,396,397],{},"    explicit ModbusReader(QObject *parent = nullptr);\n",[296,399,401],{"class":298,"line":400},18,[296,402,403],{},"    ~ModbusReader();\n",[296,405,407],{"class":298,"line":406},19,[296,408,315],{"emptyLinePlaceholder":314},[296,410,412],{"class":298,"line":411},20,[296,413,414],{},"    float grossWeight() const { return m_grossWeight; }\n",[296,416,418],{"class":298,"line":417},21,[296,419,420],{},"    float netWeight() const { return m_netWeight; }\n",[296,422,424],{"class":298,"line":423},22,[296,425,426],{},"    float tare() const { return m_tare; }\n",[296,428,430],{"class":298,"line":429},23,[296,431,432],{},"    bool connected() const { return m_connected; }\n",[296,434,436],{"class":298,"line":435},24,[296,437,315],{"emptyLinePlaceholder":314},[296,439,441],{"class":298,"line":440},25,[296,442,443],{},"    Q_INVOKABLE void connectToDevice(const QString &ip, int port = 502);\n",[296,445,447],{"class":298,"line":446},26,[296,448,449],{},"    Q_INVOKABLE void zero();\n",[296,451,453],{"class":298,"line":452},27,[296,454,455],{},"    Q_INVOKABLE void setTare();\n",[296,457,459],{"class":298,"line":458},28,[296,460,315],{"emptyLinePlaceholder":314},[296,462,464],{"class":298,"line":463},29,[296,465,466],{},"signals:\n",[296,468,470],{"class":298,"line":469},30,[296,471,472],{},"    void weightChanged();\n",[296,474,476],{"class":298,"line":475},31,[296,477,478],{},"    void connectionChanged();\n",[296,480,482],{"class":298,"line":481},32,[296,483,484],{},"    void errorOccurred(const QString &error);\n",[296,486,488],{"class":298,"line":487},33,[296,489,315],{"emptyLinePlaceholder":314},[296,491,493],{"class":298,"line":492},34,[296,494,495],{},"private slots:\n",[296,497,499],{"class":298,"line":498},35,[296,500,501],{},"    void onStateChanged(QModbusDevice::State state);\n",[296,503,505],{"class":298,"line":504},36,[296,506,507],{},"    void onReadReady();\n",[296,509,511],{"class":298,"line":510},37,[296,512,513],{},"    void readRegisters();\n",[296,515,517],{"class":298,"line":516},38,[296,518,315],{"emptyLinePlaceholder":314},[296,520,522],{"class":298,"line":521},39,[296,523,524],{},"private:\n",[296,526,528],{"class":298,"line":527},40,[296,529,530],{},"    QModbusTcpClient *m_modbusClient;\n",[296,532,534],{"class":298,"line":533},41,[296,535,536],{},"    QTimer *m_readTimer;\n",[296,538,540],{"class":298,"line":539},42,[296,541,315],{"emptyLinePlaceholder":314},[296,543,545],{"class":298,"line":544},43,[296,546,547],{},"    float m_grossWeight = 0.0f;\n",[296,549,551],{"class":298,"line":550},44,[296,552,553],{},"    float m_netWeight = 0.0f;\n",[296,555,557],{"class":298,"line":556},45,[296,558,559],{},"    float m_tare = 0.0f;\n",[296,561,563],{"class":298,"line":562},46,[296,564,565],{},"    bool m_connected = false;\n",[296,567,569],{"class":298,"line":568},47,[296,570,315],{"emptyLinePlaceholder":314},[296,572,574],{"class":298,"line":573},48,[296,575,576],{},"    float registersToFloat(quint16 reg1, quint16 reg2);\n",[296,578,580],{"class":298,"line":579},49,[296,581,582],{},"};\n",[296,584,586],{"class":298,"line":585},50,[296,587,315],{"emptyLinePlaceholder":314},[296,589,591],{"class":298,"line":590},51,[296,592,593],{},"#endif\n",[15,595,596],{},[19,597,598],{},[61,599,600],{},"ModbusReader.cpp",[54,602,604],{"className":290,"code":603,"language":292,"meta":63,"style":63},"#include \"ModbusReader.h\"\n#include \u003CQModbusDataUnit>\n#include \u003CQDebug>\n\nModbusReader::ModbusReader(QObject *parent)\n    : QObject(parent)\n{\n    m_modbusClient = new QModbusTcpClient(this);\n\n    connect(m_modbusClient, &QModbusClient::stateChanged,\n            this, &ModbusReader::onStateChanged);\n\n    // Read every 200ms\n    m_readTimer = new QTimer(this);\n    connect(m_readTimer, &QTimer::timeout, this, &ModbusReader::readRegisters);\n}\n\nvoid ModbusReader::connectToDevice(const QString &ip, int port)\n{\n    m_modbusClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, ip);\n    m_modbusClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, port);\n    m_modbusClient->setTimeout(1000);\n    m_modbusClient->setNumberOfRetries(3);\n\n    m_modbusClient->connectDevice();\n}\n\nvoid ModbusReader::onStateChanged(QModbusDevice::State state)\n{\n    m_connected = (state == QModbusDevice::ConnectedState);\n    emit connectionChanged();\n\n    if (m_connected) {\n        qDebug() \u003C\u003C \"✓ Connected to GDT\";\n        m_readTimer->start(200);  // 5 Hz update rate\n    } else {\n        m_readTimer->stop();\n    }\n}\n\nvoid ModbusReader::readRegisters()\n{\n    if (!m_modbusClient || !m_connected) return;\n\n    // Read holding registers 40001-40006 (6 registers = 3 floats)\n    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 6);\n\n    auto *reply = m_modbusClient->sendReadRequest(readUnit, 1);  // Unit ID = 1\n\n    if (reply) {\n        if (!reply->isFinished()) {\n            connect(reply, &QModbusReply::finished, this, &ModbusReader::onReadReady);\n        } else {\n            delete reply;\n        }\n    }\n}\n\nvoid ModbusReader::onReadReady()\n{\n    auto *reply = qobject_cast\u003CQModbusReply *>(sender());\n    if (!reply) return;\n\n    if (reply->error() == QModbusDevice::NoError) {\n        const QModbusDataUnit unit = reply->result();\n\n        // Parse Float32 values (2 registers each)\n        m_grossWeight = registersToFloat(unit.value(0), unit.value(1));\n        m_netWeight = registersToFloat(unit.value(2), unit.value(3));\n        m_tare = registersToFloat(unit.value(4), unit.value(5));\n\n        emit weightChanged();\n    } else {\n        emit errorOccurred(reply->errorString());\n    }\n\n    reply->deleteLater();\n}\n\nfloat ModbusReader::registersToFloat(quint16 reg1, quint16 reg2)\n{\n    // IEEE 754 big-endian conversion\n    quint32 raw = (static_cast\u003Cquint32>(reg1) \u003C\u003C 16) | reg2;\n    float value;\n    memcpy(&value, &raw, sizeof(float));\n    return value;\n}\n\nvoid ModbusReader::zero()\n{\n    // Write 1 to register 40201\n    QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 200, 1);\n    writeUnit.setValue(0, 1);\n\n    m_modbusClient->sendWriteRequest(writeUnit, 1);\n    qDebug() \u003C\u003C \"Zero command sent\";\n}\n\nvoid ModbusReader::setTare()\n{\n    // Write 1 to register 40202\n    QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 201, 1);\n    writeUnit.setValue(0, 1);\n\n    m_modbusClient->sendWriteRequest(writeUnit, 1);\n    qDebug() \u003C\u003C \"Tare command sent\";\n}\n",[61,605,606,611,616,621,625,630,635,639,644,648,653,658,662,667,672,677,682,686,691,695,700,705,710,715,719,724,728,732,737,741,746,751,755,760,765,770,775,780,785,789,793,798,802,807,811,816,821,825,830,834,839,844,850,856,862,868,873,878,883,889,894,900,906,911,917,923,928,934,940,946,952,957,963,968,974,979,984,990,995,1000,1006,1011,1017,1023,1029,1035,1041,1046,1051,1057,1062,1068,1074,1080,1085,1091,1097,1102,1107,1113,1118,1124,1130,1135,1140,1145,1151],{"__ignoreMap":63},[296,607,608],{"class":298,"line":299},[296,609,610],{},"#include \"ModbusReader.h\"\n",[296,612,613],{"class":298,"line":305},[296,614,615],{},"#include \u003CQModbusDataUnit>\n",[296,617,618],{"class":298,"line":311},[296,619,620],{},"#include \u003CQDebug>\n",[296,622,623],{"class":298,"line":318},[296,624,315],{"emptyLinePlaceholder":314},[296,626,627],{"class":298,"line":324},[296,628,629],{},"ModbusReader::ModbusReader(QObject *parent)\n",[296,631,632],{"class":298,"line":330},[296,633,634],{},"    : QObject(parent)\n",[296,636,637],{"class":298,"line":336},[296,638,350],{},[296,640,641],{"class":298,"line":341},[296,642,643],{},"    m_modbusClient = new QModbusTcpClient(this);\n",[296,645,646],{"class":298,"line":347},[296,647,315],{"emptyLinePlaceholder":314},[296,649,650],{"class":298,"line":353},[296,651,652],{},"    connect(m_modbusClient, &QModbusClient::stateChanged,\n",[296,654,655],{"class":298,"line":359},[296,656,657],{},"            this, &ModbusReader::onStateChanged);\n",[296,659,660],{"class":298,"line":365},[296,661,315],{"emptyLinePlaceholder":314},[296,663,664],{"class":298,"line":371},[296,665,666],{},"    // Read every 200ms\n",[296,668,669],{"class":298,"line":377},[296,670,671],{},"    m_readTimer = new QTimer(this);\n",[296,673,674],{"class":298,"line":383},[296,675,676],{},"    connect(m_readTimer, &QTimer::timeout, this, &ModbusReader::readRegisters);\n",[296,678,679],{"class":298,"line":388},[296,680,681],{},"}\n",[296,683,684],{"class":298,"line":394},[296,685,315],{"emptyLinePlaceholder":314},[296,687,688],{"class":298,"line":400},[296,689,690],{},"void ModbusReader::connectToDevice(const QString &ip, int port)\n",[296,692,693],{"class":298,"line":406},[296,694,350],{},[296,696,697],{"class":298,"line":411},[296,698,699],{},"    m_modbusClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, ip);\n",[296,701,702],{"class":298,"line":417},[296,703,704],{},"    m_modbusClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, port);\n",[296,706,707],{"class":298,"line":423},[296,708,709],{},"    m_modbusClient->setTimeout(1000);\n",[296,711,712],{"class":298,"line":429},[296,713,714],{},"    m_modbusClient->setNumberOfRetries(3);\n",[296,716,717],{"class":298,"line":435},[296,718,315],{"emptyLinePlaceholder":314},[296,720,721],{"class":298,"line":440},[296,722,723],{},"    m_modbusClient->connectDevice();\n",[296,725,726],{"class":298,"line":446},[296,727,681],{},[296,729,730],{"class":298,"line":452},[296,731,315],{"emptyLinePlaceholder":314},[296,733,734],{"class":298,"line":458},[296,735,736],{},"void ModbusReader::onStateChanged(QModbusDevice::State state)\n",[296,738,739],{"class":298,"line":463},[296,740,350],{},[296,742,743],{"class":298,"line":469},[296,744,745],{},"    m_connected = (state == QModbusDevice::ConnectedState);\n",[296,747,748],{"class":298,"line":475},[296,749,750],{},"    emit connectionChanged();\n",[296,752,753],{"class":298,"line":481},[296,754,315],{"emptyLinePlaceholder":314},[296,756,757],{"class":298,"line":487},[296,758,759],{},"    if (m_connected) {\n",[296,761,762],{"class":298,"line":492},[296,763,764],{},"        qDebug() \u003C\u003C \"✓ Connected to GDT\";\n",[296,766,767],{"class":298,"line":498},[296,768,769],{},"        m_readTimer->start(200);  // 5 Hz update rate\n",[296,771,772],{"class":298,"line":504},[296,773,774],{},"    } else {\n",[296,776,777],{"class":298,"line":510},[296,778,779],{},"        m_readTimer->stop();\n",[296,781,782],{"class":298,"line":516},[296,783,784],{},"    }\n",[296,786,787],{"class":298,"line":521},[296,788,681],{},[296,790,791],{"class":298,"line":527},[296,792,315],{"emptyLinePlaceholder":314},[296,794,795],{"class":298,"line":533},[296,796,797],{},"void ModbusReader::readRegisters()\n",[296,799,800],{"class":298,"line":539},[296,801,350],{},[296,803,804],{"class":298,"line":544},[296,805,806],{},"    if (!m_modbusClient || !m_connected) return;\n",[296,808,809],{"class":298,"line":550},[296,810,315],{"emptyLinePlaceholder":314},[296,812,813],{"class":298,"line":556},[296,814,815],{},"    // Read holding registers 40001-40006 (6 registers = 3 floats)\n",[296,817,818],{"class":298,"line":562},[296,819,820],{},"    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 6);\n",[296,822,823],{"class":298,"line":568},[296,824,315],{"emptyLinePlaceholder":314},[296,826,827],{"class":298,"line":573},[296,828,829],{},"    auto *reply = m_modbusClient->sendReadRequest(readUnit, 1);  // Unit ID = 1\n",[296,831,832],{"class":298,"line":579},[296,833,315],{"emptyLinePlaceholder":314},[296,835,836],{"class":298,"line":585},[296,837,838],{},"    if (reply) {\n",[296,840,841],{"class":298,"line":590},[296,842,843],{},"        if (!reply->isFinished()) {\n",[296,845,847],{"class":298,"line":846},52,[296,848,849],{},"            connect(reply, &QModbusReply::finished, this, &ModbusReader::onReadReady);\n",[296,851,853],{"class":298,"line":852},53,[296,854,855],{},"        } else {\n",[296,857,859],{"class":298,"line":858},54,[296,860,861],{},"            delete reply;\n",[296,863,865],{"class":298,"line":864},55,[296,866,867],{},"        }\n",[296,869,871],{"class":298,"line":870},56,[296,872,784],{},[296,874,876],{"class":298,"line":875},57,[296,877,681],{},[296,879,881],{"class":298,"line":880},58,[296,882,315],{"emptyLinePlaceholder":314},[296,884,886],{"class":298,"line":885},59,[296,887,888],{},"void ModbusReader::onReadReady()\n",[296,890,892],{"class":298,"line":891},60,[296,893,350],{},[296,895,897],{"class":298,"line":896},61,[296,898,899],{},"    auto *reply = qobject_cast\u003CQModbusReply *>(sender());\n",[296,901,903],{"class":298,"line":902},62,[296,904,905],{},"    if (!reply) return;\n",[296,907,909],{"class":298,"line":908},63,[296,910,315],{"emptyLinePlaceholder":314},[296,912,914],{"class":298,"line":913},64,[296,915,916],{},"    if (reply->error() == QModbusDevice::NoError) {\n",[296,918,920],{"class":298,"line":919},65,[296,921,922],{},"        const QModbusDataUnit unit = reply->result();\n",[296,924,926],{"class":298,"line":925},66,[296,927,315],{"emptyLinePlaceholder":314},[296,929,931],{"class":298,"line":930},67,[296,932,933],{},"        // Parse Float32 values (2 registers each)\n",[296,935,937],{"class":298,"line":936},68,[296,938,939],{},"        m_grossWeight = registersToFloat(unit.value(0), unit.value(1));\n",[296,941,943],{"class":298,"line":942},69,[296,944,945],{},"        m_netWeight = registersToFloat(unit.value(2), unit.value(3));\n",[296,947,949],{"class":298,"line":948},70,[296,950,951],{},"        m_tare = registersToFloat(unit.value(4), unit.value(5));\n",[296,953,955],{"class":298,"line":954},71,[296,956,315],{"emptyLinePlaceholder":314},[296,958,960],{"class":298,"line":959},72,[296,961,962],{},"        emit weightChanged();\n",[296,964,966],{"class":298,"line":965},73,[296,967,774],{},[296,969,971],{"class":298,"line":970},74,[296,972,973],{},"        emit errorOccurred(reply->errorString());\n",[296,975,977],{"class":298,"line":976},75,[296,978,784],{},[296,980,982],{"class":298,"line":981},76,[296,983,315],{"emptyLinePlaceholder":314},[296,985,987],{"class":298,"line":986},77,[296,988,989],{},"    reply->deleteLater();\n",[296,991,993],{"class":298,"line":992},78,[296,994,681],{},[296,996,998],{"class":298,"line":997},79,[296,999,315],{"emptyLinePlaceholder":314},[296,1001,1003],{"class":298,"line":1002},80,[296,1004,1005],{},"float ModbusReader::registersToFloat(quint16 reg1, quint16 reg2)\n",[296,1007,1009],{"class":298,"line":1008},81,[296,1010,350],{},[296,1012,1014],{"class":298,"line":1013},82,[296,1015,1016],{},"    // IEEE 754 big-endian conversion\n",[296,1018,1020],{"class":298,"line":1019},83,[296,1021,1022],{},"    quint32 raw = (static_cast\u003Cquint32>(reg1) \u003C\u003C 16) | reg2;\n",[296,1024,1026],{"class":298,"line":1025},84,[296,1027,1028],{},"    float value;\n",[296,1030,1032],{"class":298,"line":1031},85,[296,1033,1034],{},"    memcpy(&value, &raw, sizeof(float));\n",[296,1036,1038],{"class":298,"line":1037},86,[296,1039,1040],{},"    return value;\n",[296,1042,1044],{"class":298,"line":1043},87,[296,1045,681],{},[296,1047,1049],{"class":298,"line":1048},88,[296,1050,315],{"emptyLinePlaceholder":314},[296,1052,1054],{"class":298,"line":1053},89,[296,1055,1056],{},"void ModbusReader::zero()\n",[296,1058,1060],{"class":298,"line":1059},90,[296,1061,350],{},[296,1063,1065],{"class":298,"line":1064},91,[296,1066,1067],{},"    // Write 1 to register 40201\n",[296,1069,1071],{"class":298,"line":1070},92,[296,1072,1073],{},"    QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 200, 1);\n",[296,1075,1077],{"class":298,"line":1076},93,[296,1078,1079],{},"    writeUnit.setValue(0, 1);\n",[296,1081,1083],{"class":298,"line":1082},94,[296,1084,315],{"emptyLinePlaceholder":314},[296,1086,1088],{"class":298,"line":1087},95,[296,1089,1090],{},"    m_modbusClient->sendWriteRequest(writeUnit, 1);\n",[296,1092,1094],{"class":298,"line":1093},96,[296,1095,1096],{},"    qDebug() \u003C\u003C \"Zero command sent\";\n",[296,1098,1100],{"class":298,"line":1099},97,[296,1101,681],{},[296,1103,1105],{"class":298,"line":1104},98,[296,1106,315],{"emptyLinePlaceholder":314},[296,1108,1110],{"class":298,"line":1109},99,[296,1111,1112],{},"void ModbusReader::setTare()\n",[296,1114,1116],{"class":298,"line":1115},100,[296,1117,350],{},[296,1119,1121],{"class":298,"line":1120},101,[296,1122,1123],{},"    // Write 1 to register 40202\n",[296,1125,1127],{"class":298,"line":1126},102,[296,1128,1129],{},"    QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 201, 1);\n",[296,1131,1133],{"class":298,"line":1132},103,[296,1134,1079],{},[296,1136,1138],{"class":298,"line":1137},104,[296,1139,315],{"emptyLinePlaceholder":314},[296,1141,1143],{"class":298,"line":1142},105,[296,1144,1090],{},[296,1146,1148],{"class":298,"line":1147},106,[296,1149,1150],{},"    qDebug() \u003C\u003C \"Tare command sent\";\n",[296,1152,1154],{"class":298,"line":1153},107,[296,1155,681],{},[277,1157,1159],{"id":1158},"qml-user-interface","QML User Interface",[15,1161,1162],{},[19,1163,1164],{},[61,1165,1166],{},"main.qml",[54,1168,1172],{"className":1169,"code":1170,"language":1171,"meta":63,"style":63},"language-qml shiki shiki-themes github-light github-dark","import QtQuick 2.15\nimport QtQuick.Controls 2.15\nimport QtQuick.Layouts 1.15\nimport QtCharts 2.15\nimport com.amazeng 1.0  // ModbusReader\n\nApplicationWindow {\n    visible: true\n    width: 1024\n    height: 600\n    title: \"GDT Weighing System\"\n\n    ModbusReader {\n        id: modbusReader\n        Component.onCompleted: {\n            connectToDevice(\"192.168.1.100\", 502)\n        }\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        color: \"#1E1E1E\"\n\n        ColumnLayout {\n            anchors.fill: parent\n            anchors.margins: 20\n            spacing: 20\n\n            // Header\n            Rectangle {\n                Layout.fillWidth: true\n                height: 60\n                color: \"#2D2D2D\"\n                radius: 8\n\n                RowLayout {\n                    anchors.fill: parent\n                    anchors.margins: 10\n\n                    Text {\n                        text: \"GDT-410M Weighing Station\"\n                        font.pixelSize: 28\n                        font.bold: true\n                        color: \"#FFFFFF\"\n                    }\n\n                    Item { Layout.fillWidth: true }\n\n                    Rectangle {\n                        width: 20\n                        height: 20\n                        radius: 10\n                        color: modbusReader.connected ? \"#2ECC71\" : \"#E74C3C\"\n                    }\n\n                    Text {\n                        text: modbusReader.connected ? \"Connected\" : \"Disconnected\"\n                        font.pixelSize: 16\n                        color: \"#FFFFFF\"\n                    }\n                }\n            }\n\n            // Main weight display\n            Rectangle {\n                Layout.fillWidth: true\n                Layout.preferredHeight: 250\n                color: \"#27AE60\"\n                radius: 12\n\n                ColumnLayout {\n                    anchors.centerIn: parent\n                    spacing: 10\n\n                    Text {\n                        text: \"NET WEIGHT\"\n                        font.pixelSize: 24\n                        color: \"white\"\n                        Layout.alignment: Qt.AlignHCenter\n                    }\n\n                    Text {\n                        text: modbusReader.netWeight.toFixed(2)\n                        font.pixelSize: 96\n                        font.bold: true\n                        color: \"white\"\n                        Layout.alignment: Qt.AlignHCenter\n                    }\n\n                    Text {\n                        text: \"kg\"\n                        font.pixelSize: 36\n                        color: \"white\"\n                        Layout.alignment: Qt.AlignHCenter\n                    }\n                }\n            }\n\n            // Gross and Tare\n            RowLayout {\n                Layout.fillWidth: true\n                spacing: 20\n\n                Rectangle {\n                    Layout.fillWidth: true\n                    height: 120\n                    color: \"#34495E\"\n                    radius: 8\n\n                    ColumnLayout {\n                        anchors.centerIn: parent\n                        spacing: 5\n\n                        Text {\n                            text: \"Gross\"\n                            font.pixelSize: 18\n                            color: \"#BDC3C7\"\n                            Layout.alignment: Qt.AlignHCenter\n                        }\n\n                        Text {\n                            text: modbusReader.grossWeight.toFixed(2) + \" kg\"\n                            font.pixelSize: 32\n                            color: \"white\"\n                            Layout.alignment: Qt.AlignHCenter\n                        }\n                    }\n                }\n\n                Rectangle {\n                    Layout.fillWidth: true\n                    height: 120\n                    color: \"#34495E\"\n                    radius: 8\n\n                    ColumnLayout {\n                        anchors.centerIn: parent\n                        spacing: 5\n\n                        Text {\n                            text: \"Tare\"\n                            font.pixelSize: 18\n                            color: \"#BDC3C7\"\n                            Layout.alignment: Qt.AlignHCenter\n                        }\n\n                        Text {\n                            text: modbusReader.tare.toFixed(2) + \" kg\"\n                            font.pixelSize: 32\n                            color: \"white\"\n                            Layout.alignment: Qt.AlignHCenter\n                        }\n                    }\n                }\n            }\n\n            // Control buttons\n            RowLayout {\n                Layout.fillWidth: true\n                spacing: 20\n\n                Button {\n                    text: \"ZERO\"\n                    Layout.fillWidth: true\n                    Layout.preferredHeight: 80\n                    font.pixelSize: 24\n                    onClicked: modbusReader.zero()\n\n                    background: Rectangle {\n                        color: parent.pressed ? \"#E67E22\" : \"#F39C12\"\n                        radius: 8\n                    }\n\n                    contentItem: Text {\n                        text: parent.text\n                        font: parent.font\n                        color: \"white\"\n                        horizontalAlignment: Text.AlignHCenter\n                        verticalAlignment: Text.AlignVCenter\n                    }\n                }\n\n                Button {\n                    text: \"TARE\"\n                    Layout.fillWidth: true\n                    Layout.preferredHeight: 80\n                    font.pixelSize: 24\n                    onClicked: modbusReader.setTare()\n\n                    background: Rectangle {\n                        color: parent.pressed ? \"#2980B9\" : \"#3498DB\"\n                        radius: 8\n                    }\n\n                    contentItem: Text {\n                        text: parent.text\n                        font: parent.font\n                        color: \"white\"\n                        horizontalAlignment: Text.AlignHCenter\n                        verticalAlignment: Text.AlignVCenter\n                    }\n                }\n            }\n        }\n    }\n}\n","qml",[61,1173,1174,1179,1184,1189,1194,1199,1203,1208,1213,1218,1223,1228,1232,1237,1242,1247,1252,1256,1260,1264,1269,1274,1279,1283,1288,1293,1298,1303,1307,1312,1317,1322,1327,1332,1337,1341,1346,1351,1356,1360,1365,1370,1375,1380,1385,1390,1394,1399,1403,1408,1413,1418,1423,1428,1432,1436,1440,1445,1450,1454,1458,1463,1468,1472,1477,1481,1485,1490,1495,1500,1504,1509,1514,1519,1523,1527,1532,1537,1542,1547,1551,1555,1559,1564,1569,1573,1577,1581,1585,1589,1593,1598,1603,1607,1611,1615,1619,1623,1627,1632,1637,1641,1646,1650,1655,1660,1665,1670,1676,1681,1687,1693,1699,1704,1710,1716,1722,1728,1734,1740,1745,1750,1756,1762,1768,1773,1778,1783,1788,1793,1798,1803,1808,1813,1818,1823,1828,1833,1838,1843,1848,1854,1859,1864,1869,1874,1879,1884,1890,1895,1900,1905,1910,1915,1920,1925,1930,1936,1941,1946,1951,1956,1962,1968,1973,1979,1985,1991,1996,2002,2008,2014,2019,2024,2030,2036,2042,2047,2053,2059,2064,2069,2074,2079,2085,2090,2095,2100,2106,2111,2116,2122,2127,2132,2137,2142,2147,2152,2157,2162,2167,2172,2177,2182,2187,2192],{"__ignoreMap":63},[296,1175,1176],{"class":298,"line":299},[296,1177,1178],{},"import QtQuick 2.15\n",[296,1180,1181],{"class":298,"line":305},[296,1182,1183],{},"import QtQuick.Controls 2.15\n",[296,1185,1186],{"class":298,"line":311},[296,1187,1188],{},"import QtQuick.Layouts 1.15\n",[296,1190,1191],{"class":298,"line":318},[296,1192,1193],{},"import QtCharts 2.15\n",[296,1195,1196],{"class":298,"line":324},[296,1197,1198],{},"import com.amazeng 1.0  // ModbusReader\n",[296,1200,1201],{"class":298,"line":330},[296,1202,315],{"emptyLinePlaceholder":314},[296,1204,1205],{"class":298,"line":336},[296,1206,1207],{},"ApplicationWindow {\n",[296,1209,1210],{"class":298,"line":341},[296,1211,1212],{},"    visible: true\n",[296,1214,1215],{"class":298,"line":347},[296,1216,1217],{},"    width: 1024\n",[296,1219,1220],{"class":298,"line":353},[296,1221,1222],{},"    height: 600\n",[296,1224,1225],{"class":298,"line":359},[296,1226,1227],{},"    title: \"GDT Weighing System\"\n",[296,1229,1230],{"class":298,"line":365},[296,1231,315],{"emptyLinePlaceholder":314},[296,1233,1234],{"class":298,"line":371},[296,1235,1236],{},"    ModbusReader {\n",[296,1238,1239],{"class":298,"line":377},[296,1240,1241],{},"        id: modbusReader\n",[296,1243,1244],{"class":298,"line":383},[296,1245,1246],{},"        Component.onCompleted: {\n",[296,1248,1249],{"class":298,"line":388},[296,1250,1251],{},"            connectToDevice(\"192.168.1.100\", 502)\n",[296,1253,1254],{"class":298,"line":394},[296,1255,867],{},[296,1257,1258],{"class":298,"line":400},[296,1259,784],{},[296,1261,1262],{"class":298,"line":406},[296,1263,315],{"emptyLinePlaceholder":314},[296,1265,1266],{"class":298,"line":411},[296,1267,1268],{},"    Rectangle {\n",[296,1270,1271],{"class":298,"line":417},[296,1272,1273],{},"        anchors.fill: parent\n",[296,1275,1276],{"class":298,"line":423},[296,1277,1278],{},"        color: \"#1E1E1E\"\n",[296,1280,1281],{"class":298,"line":429},[296,1282,315],{"emptyLinePlaceholder":314},[296,1284,1285],{"class":298,"line":435},[296,1286,1287],{},"        ColumnLayout {\n",[296,1289,1290],{"class":298,"line":440},[296,1291,1292],{},"            anchors.fill: parent\n",[296,1294,1295],{"class":298,"line":446},[296,1296,1297],{},"            anchors.margins: 20\n",[296,1299,1300],{"class":298,"line":452},[296,1301,1302],{},"            spacing: 20\n",[296,1304,1305],{"class":298,"line":458},[296,1306,315],{"emptyLinePlaceholder":314},[296,1308,1309],{"class":298,"line":463},[296,1310,1311],{},"            // Header\n",[296,1313,1314],{"class":298,"line":469},[296,1315,1316],{},"            Rectangle {\n",[296,1318,1319],{"class":298,"line":475},[296,1320,1321],{},"                Layout.fillWidth: true\n",[296,1323,1324],{"class":298,"line":481},[296,1325,1326],{},"                height: 60\n",[296,1328,1329],{"class":298,"line":487},[296,1330,1331],{},"                color: \"#2D2D2D\"\n",[296,1333,1334],{"class":298,"line":492},[296,1335,1336],{},"                radius: 8\n",[296,1338,1339],{"class":298,"line":498},[296,1340,315],{"emptyLinePlaceholder":314},[296,1342,1343],{"class":298,"line":504},[296,1344,1345],{},"                RowLayout {\n",[296,1347,1348],{"class":298,"line":510},[296,1349,1350],{},"                    anchors.fill: parent\n",[296,1352,1353],{"class":298,"line":516},[296,1354,1355],{},"                    anchors.margins: 10\n",[296,1357,1358],{"class":298,"line":521},[296,1359,315],{"emptyLinePlaceholder":314},[296,1361,1362],{"class":298,"line":527},[296,1363,1364],{},"                    Text {\n",[296,1366,1367],{"class":298,"line":533},[296,1368,1369],{},"                        text: \"GDT-410M Weighing Station\"\n",[296,1371,1372],{"class":298,"line":539},[296,1373,1374],{},"                        font.pixelSize: 28\n",[296,1376,1377],{"class":298,"line":544},[296,1378,1379],{},"                        font.bold: true\n",[296,1381,1382],{"class":298,"line":550},[296,1383,1384],{},"                        color: \"#FFFFFF\"\n",[296,1386,1387],{"class":298,"line":556},[296,1388,1389],{},"                    }\n",[296,1391,1392],{"class":298,"line":562},[296,1393,315],{"emptyLinePlaceholder":314},[296,1395,1396],{"class":298,"line":568},[296,1397,1398],{},"                    Item { Layout.fillWidth: true }\n",[296,1400,1401],{"class":298,"line":573},[296,1402,315],{"emptyLinePlaceholder":314},[296,1404,1405],{"class":298,"line":579},[296,1406,1407],{},"                    Rectangle {\n",[296,1409,1410],{"class":298,"line":585},[296,1411,1412],{},"                        width: 20\n",[296,1414,1415],{"class":298,"line":590},[296,1416,1417],{},"                        height: 20\n",[296,1419,1420],{"class":298,"line":846},[296,1421,1422],{},"                        radius: 10\n",[296,1424,1425],{"class":298,"line":852},[296,1426,1427],{},"                        color: modbusReader.connected ? \"#2ECC71\" : \"#E74C3C\"\n",[296,1429,1430],{"class":298,"line":858},[296,1431,1389],{},[296,1433,1434],{"class":298,"line":864},[296,1435,315],{"emptyLinePlaceholder":314},[296,1437,1438],{"class":298,"line":870},[296,1439,1364],{},[296,1441,1442],{"class":298,"line":875},[296,1443,1444],{},"                        text: modbusReader.connected ? \"Connected\" : \"Disconnected\"\n",[296,1446,1447],{"class":298,"line":880},[296,1448,1449],{},"                        font.pixelSize: 16\n",[296,1451,1452],{"class":298,"line":885},[296,1453,1384],{},[296,1455,1456],{"class":298,"line":891},[296,1457,1389],{},[296,1459,1460],{"class":298,"line":896},[296,1461,1462],{},"                }\n",[296,1464,1465],{"class":298,"line":902},[296,1466,1467],{},"            }\n",[296,1469,1470],{"class":298,"line":908},[296,1471,315],{"emptyLinePlaceholder":314},[296,1473,1474],{"class":298,"line":913},[296,1475,1476],{},"            // Main weight display\n",[296,1478,1479],{"class":298,"line":919},[296,1480,1316],{},[296,1482,1483],{"class":298,"line":925},[296,1484,1321],{},[296,1486,1487],{"class":298,"line":930},[296,1488,1489],{},"                Layout.preferredHeight: 250\n",[296,1491,1492],{"class":298,"line":936},[296,1493,1494],{},"                color: \"#27AE60\"\n",[296,1496,1497],{"class":298,"line":942},[296,1498,1499],{},"                radius: 12\n",[296,1501,1502],{"class":298,"line":948},[296,1503,315],{"emptyLinePlaceholder":314},[296,1505,1506],{"class":298,"line":954},[296,1507,1508],{},"                ColumnLayout {\n",[296,1510,1511],{"class":298,"line":959},[296,1512,1513],{},"                    anchors.centerIn: parent\n",[296,1515,1516],{"class":298,"line":965},[296,1517,1518],{},"                    spacing: 10\n",[296,1520,1521],{"class":298,"line":970},[296,1522,315],{"emptyLinePlaceholder":314},[296,1524,1525],{"class":298,"line":976},[296,1526,1364],{},[296,1528,1529],{"class":298,"line":981},[296,1530,1531],{},"                        text: \"NET WEIGHT\"\n",[296,1533,1534],{"class":298,"line":986},[296,1535,1536],{},"                        font.pixelSize: 24\n",[296,1538,1539],{"class":298,"line":992},[296,1540,1541],{},"                        color: \"white\"\n",[296,1543,1544],{"class":298,"line":997},[296,1545,1546],{},"                        Layout.alignment: Qt.AlignHCenter\n",[296,1548,1549],{"class":298,"line":1002},[296,1550,1389],{},[296,1552,1553],{"class":298,"line":1008},[296,1554,315],{"emptyLinePlaceholder":314},[296,1556,1557],{"class":298,"line":1013},[296,1558,1364],{},[296,1560,1561],{"class":298,"line":1019},[296,1562,1563],{},"                        text: modbusReader.netWeight.toFixed(2)\n",[296,1565,1566],{"class":298,"line":1025},[296,1567,1568],{},"                        font.pixelSize: 96\n",[296,1570,1571],{"class":298,"line":1031},[296,1572,1379],{},[296,1574,1575],{"class":298,"line":1037},[296,1576,1541],{},[296,1578,1579],{"class":298,"line":1043},[296,1580,1546],{},[296,1582,1583],{"class":298,"line":1048},[296,1584,1389],{},[296,1586,1587],{"class":298,"line":1053},[296,1588,315],{"emptyLinePlaceholder":314},[296,1590,1591],{"class":298,"line":1059},[296,1592,1364],{},[296,1594,1595],{"class":298,"line":1064},[296,1596,1597],{},"                        text: \"kg\"\n",[296,1599,1600],{"class":298,"line":1070},[296,1601,1602],{},"                        font.pixelSize: 36\n",[296,1604,1605],{"class":298,"line":1076},[296,1606,1541],{},[296,1608,1609],{"class":298,"line":1082},[296,1610,1546],{},[296,1612,1613],{"class":298,"line":1087},[296,1614,1389],{},[296,1616,1617],{"class":298,"line":1093},[296,1618,1462],{},[296,1620,1621],{"class":298,"line":1099},[296,1622,1467],{},[296,1624,1625],{"class":298,"line":1104},[296,1626,315],{"emptyLinePlaceholder":314},[296,1628,1629],{"class":298,"line":1109},[296,1630,1631],{},"            // Gross and Tare\n",[296,1633,1634],{"class":298,"line":1115},[296,1635,1636],{},"            RowLayout {\n",[296,1638,1639],{"class":298,"line":1120},[296,1640,1321],{},[296,1642,1643],{"class":298,"line":1126},[296,1644,1645],{},"                spacing: 20\n",[296,1647,1648],{"class":298,"line":1132},[296,1649,315],{"emptyLinePlaceholder":314},[296,1651,1652],{"class":298,"line":1137},[296,1653,1654],{},"                Rectangle {\n",[296,1656,1657],{"class":298,"line":1142},[296,1658,1659],{},"                    Layout.fillWidth: true\n",[296,1661,1662],{"class":298,"line":1147},[296,1663,1664],{},"                    height: 120\n",[296,1666,1667],{"class":298,"line":1153},[296,1668,1669],{},"                    color: \"#34495E\"\n",[296,1671,1673],{"class":298,"line":1672},108,[296,1674,1675],{},"                    radius: 8\n",[296,1677,1679],{"class":298,"line":1678},109,[296,1680,315],{"emptyLinePlaceholder":314},[296,1682,1684],{"class":298,"line":1683},110,[296,1685,1686],{},"                    ColumnLayout {\n",[296,1688,1690],{"class":298,"line":1689},111,[296,1691,1692],{},"                        anchors.centerIn: parent\n",[296,1694,1696],{"class":298,"line":1695},112,[296,1697,1698],{},"                        spacing: 5\n",[296,1700,1702],{"class":298,"line":1701},113,[296,1703,315],{"emptyLinePlaceholder":314},[296,1705,1707],{"class":298,"line":1706},114,[296,1708,1709],{},"                        Text {\n",[296,1711,1713],{"class":298,"line":1712},115,[296,1714,1715],{},"                            text: \"Gross\"\n",[296,1717,1719],{"class":298,"line":1718},116,[296,1720,1721],{},"                            font.pixelSize: 18\n",[296,1723,1725],{"class":298,"line":1724},117,[296,1726,1727],{},"                            color: \"#BDC3C7\"\n",[296,1729,1731],{"class":298,"line":1730},118,[296,1732,1733],{},"                            Layout.alignment: Qt.AlignHCenter\n",[296,1735,1737],{"class":298,"line":1736},119,[296,1738,1739],{},"                        }\n",[296,1741,1743],{"class":298,"line":1742},120,[296,1744,315],{"emptyLinePlaceholder":314},[296,1746,1748],{"class":298,"line":1747},121,[296,1749,1709],{},[296,1751,1753],{"class":298,"line":1752},122,[296,1754,1755],{},"                            text: modbusReader.grossWeight.toFixed(2) + \" kg\"\n",[296,1757,1759],{"class":298,"line":1758},123,[296,1760,1761],{},"                            font.pixelSize: 32\n",[296,1763,1765],{"class":298,"line":1764},124,[296,1766,1767],{},"                            color: \"white\"\n",[296,1769,1771],{"class":298,"line":1770},125,[296,1772,1733],{},[296,1774,1776],{"class":298,"line":1775},126,[296,1777,1739],{},[296,1779,1781],{"class":298,"line":1780},127,[296,1782,1389],{},[296,1784,1786],{"class":298,"line":1785},128,[296,1787,1462],{},[296,1789,1791],{"class":298,"line":1790},129,[296,1792,315],{"emptyLinePlaceholder":314},[296,1794,1796],{"class":298,"line":1795},130,[296,1797,1654],{},[296,1799,1801],{"class":298,"line":1800},131,[296,1802,1659],{},[296,1804,1806],{"class":298,"line":1805},132,[296,1807,1664],{},[296,1809,1811],{"class":298,"line":1810},133,[296,1812,1669],{},[296,1814,1816],{"class":298,"line":1815},134,[296,1817,1675],{},[296,1819,1821],{"class":298,"line":1820},135,[296,1822,315],{"emptyLinePlaceholder":314},[296,1824,1826],{"class":298,"line":1825},136,[296,1827,1686],{},[296,1829,1831],{"class":298,"line":1830},137,[296,1832,1692],{},[296,1834,1836],{"class":298,"line":1835},138,[296,1837,1698],{},[296,1839,1841],{"class":298,"line":1840},139,[296,1842,315],{"emptyLinePlaceholder":314},[296,1844,1846],{"class":298,"line":1845},140,[296,1847,1709],{},[296,1849,1851],{"class":298,"line":1850},141,[296,1852,1853],{},"                            text: \"Tare\"\n",[296,1855,1857],{"class":298,"line":1856},142,[296,1858,1721],{},[296,1860,1862],{"class":298,"line":1861},143,[296,1863,1727],{},[296,1865,1867],{"class":298,"line":1866},144,[296,1868,1733],{},[296,1870,1872],{"class":298,"line":1871},145,[296,1873,1739],{},[296,1875,1877],{"class":298,"line":1876},146,[296,1878,315],{"emptyLinePlaceholder":314},[296,1880,1882],{"class":298,"line":1881},147,[296,1883,1709],{},[296,1885,1887],{"class":298,"line":1886},148,[296,1888,1889],{},"                            text: modbusReader.tare.toFixed(2) + \" kg\"\n",[296,1891,1893],{"class":298,"line":1892},149,[296,1894,1761],{},[296,1896,1898],{"class":298,"line":1897},150,[296,1899,1767],{},[296,1901,1903],{"class":298,"line":1902},151,[296,1904,1733],{},[296,1906,1908],{"class":298,"line":1907},152,[296,1909,1739],{},[296,1911,1913],{"class":298,"line":1912},153,[296,1914,1389],{},[296,1916,1918],{"class":298,"line":1917},154,[296,1919,1462],{},[296,1921,1923],{"class":298,"line":1922},155,[296,1924,1467],{},[296,1926,1928],{"class":298,"line":1927},156,[296,1929,315],{"emptyLinePlaceholder":314},[296,1931,1933],{"class":298,"line":1932},157,[296,1934,1935],{},"            // Control buttons\n",[296,1937,1939],{"class":298,"line":1938},158,[296,1940,1636],{},[296,1942,1944],{"class":298,"line":1943},159,[296,1945,1321],{},[296,1947,1949],{"class":298,"line":1948},160,[296,1950,1645],{},[296,1952,1954],{"class":298,"line":1953},161,[296,1955,315],{"emptyLinePlaceholder":314},[296,1957,1959],{"class":298,"line":1958},162,[296,1960,1961],{},"                Button {\n",[296,1963,1965],{"class":298,"line":1964},163,[296,1966,1967],{},"                    text: \"ZERO\"\n",[296,1969,1971],{"class":298,"line":1970},164,[296,1972,1659],{},[296,1974,1976],{"class":298,"line":1975},165,[296,1977,1978],{},"                    Layout.preferredHeight: 80\n",[296,1980,1982],{"class":298,"line":1981},166,[296,1983,1984],{},"                    font.pixelSize: 24\n",[296,1986,1988],{"class":298,"line":1987},167,[296,1989,1990],{},"                    onClicked: modbusReader.zero()\n",[296,1992,1994],{"class":298,"line":1993},168,[296,1995,315],{"emptyLinePlaceholder":314},[296,1997,1999],{"class":298,"line":1998},169,[296,2000,2001],{},"                    background: Rectangle {\n",[296,2003,2005],{"class":298,"line":2004},170,[296,2006,2007],{},"                        color: parent.pressed ? \"#E67E22\" : \"#F39C12\"\n",[296,2009,2011],{"class":298,"line":2010},171,[296,2012,2013],{},"                        radius: 8\n",[296,2015,2017],{"class":298,"line":2016},172,[296,2018,1389],{},[296,2020,2022],{"class":298,"line":2021},173,[296,2023,315],{"emptyLinePlaceholder":314},[296,2025,2027],{"class":298,"line":2026},174,[296,2028,2029],{},"                    contentItem: Text {\n",[296,2031,2033],{"class":298,"line":2032},175,[296,2034,2035],{},"                        text: parent.text\n",[296,2037,2039],{"class":298,"line":2038},176,[296,2040,2041],{},"                        font: parent.font\n",[296,2043,2045],{"class":298,"line":2044},177,[296,2046,1541],{},[296,2048,2050],{"class":298,"line":2049},178,[296,2051,2052],{},"                        horizontalAlignment: Text.AlignHCenter\n",[296,2054,2056],{"class":298,"line":2055},179,[296,2057,2058],{},"                        verticalAlignment: Text.AlignVCenter\n",[296,2060,2062],{"class":298,"line":2061},180,[296,2063,1389],{},[296,2065,2067],{"class":298,"line":2066},181,[296,2068,1462],{},[296,2070,2072],{"class":298,"line":2071},182,[296,2073,315],{"emptyLinePlaceholder":314},[296,2075,2077],{"class":298,"line":2076},183,[296,2078,1961],{},[296,2080,2082],{"class":298,"line":2081},184,[296,2083,2084],{},"                    text: \"TARE\"\n",[296,2086,2088],{"class":298,"line":2087},185,[296,2089,1659],{},[296,2091,2093],{"class":298,"line":2092},186,[296,2094,1978],{},[296,2096,2098],{"class":298,"line":2097},187,[296,2099,1984],{},[296,2101,2103],{"class":298,"line":2102},188,[296,2104,2105],{},"                    onClicked: modbusReader.setTare()\n",[296,2107,2109],{"class":298,"line":2108},189,[296,2110,315],{"emptyLinePlaceholder":314},[296,2112,2114],{"class":298,"line":2113},190,[296,2115,2001],{},[296,2117,2119],{"class":298,"line":2118},191,[296,2120,2121],{},"                        color: parent.pressed ? \"#2980B9\" : \"#3498DB\"\n",[296,2123,2125],{"class":298,"line":2124},192,[296,2126,2013],{},[296,2128,2130],{"class":298,"line":2129},193,[296,2131,1389],{},[296,2133,2135],{"class":298,"line":2134},194,[296,2136,315],{"emptyLinePlaceholder":314},[296,2138,2140],{"class":298,"line":2139},195,[296,2141,2029],{},[296,2143,2145],{"class":298,"line":2144},196,[296,2146,2035],{},[296,2148,2150],{"class":298,"line":2149},197,[296,2151,2041],{},[296,2153,2155],{"class":298,"line":2154},198,[296,2156,1541],{},[296,2158,2160],{"class":298,"line":2159},199,[296,2161,2052],{},[296,2163,2165],{"class":298,"line":2164},200,[296,2166,2058],{},[296,2168,2170],{"class":298,"line":2169},201,[296,2171,1389],{},[296,2173,2175],{"class":298,"line":2174},202,[296,2176,1462],{},[296,2178,2180],{"class":298,"line":2179},203,[296,2181,1467],{},[296,2183,2185],{"class":298,"line":2184},204,[296,2186,867],{},[296,2188,2190],{"class":298,"line":2189},205,[296,2191,784],{},[296,2193,2195],{"class":298,"line":2194},206,[296,2196,681],{},[10,2198,2200],{"id":2199},"real-world-application-automatic-packaging-line","Real-World Application: Automatic Packaging Line",[277,2202,2204],{"id":2203},"scenario","Scenario",[15,2206,2207],{},"Products are weighed and automatically recorded in a packaging line.",[15,2209,2210],{},[19,2211,2212],{},"Requirements:",[2214,2215,2216,2223,2229],"ol",{},[2217,2218,2219,2222],"li",{},[19,2220,2221],{},"Target Weight:"," 25 kg ± 0.1 kg",[2217,2224,2225,2228],{},[19,2226,2227],{},"Automatic Recording:"," Product over threshold → Save to database",[2217,2230,2231,2234],{},[19,2232,2233],{},"Tare:"," Automatic tare after every 10 weighing operations",[277,2236,2238],{"id":2237},"implementation","Implementation",[15,2240,2241],{},[19,2242,2243],{},"Data Recording (SQLite):",[54,2245,2247],{"className":290,"code":2246,"language":292,"meta":63,"style":63},"// DatabaseManager.cpp\nvoid DatabaseManager::saveWeighing(float weight, const QString &batchCode)\n{\n    QSqlQuery query(m_db);\n    query.prepare(\"INSERT INTO weighings (timestamp, weight, batch_code) \"\n                  \"VALUES (datetime('now'), :weight, :batch)\");\n    query.bindValue(\":weight\", weight);\n    query.bindValue(\":batch\", batchCode);\n    query.exec();\n}\n",[61,2248,2249,2254,2259,2263,2268,2273,2278,2283,2288,2293],{"__ignoreMap":63},[296,2250,2251],{"class":298,"line":299},[296,2252,2253],{},"// DatabaseManager.cpp\n",[296,2255,2256],{"class":298,"line":305},[296,2257,2258],{},"void DatabaseManager::saveWeighing(float weight, const QString &batchCode)\n",[296,2260,2261],{"class":298,"line":311},[296,2262,350],{},[296,2264,2265],{"class":298,"line":318},[296,2266,2267],{},"    QSqlQuery query(m_db);\n",[296,2269,2270],{"class":298,"line":324},[296,2271,2272],{},"    query.prepare(\"INSERT INTO weighings (timestamp, weight, batch_code) \"\n",[296,2274,2275],{"class":298,"line":330},[296,2276,2277],{},"                  \"VALUES (datetime('now'), :weight, :batch)\");\n",[296,2279,2280],{"class":298,"line":336},[296,2281,2282],{},"    query.bindValue(\":weight\", weight);\n",[296,2284,2285],{"class":298,"line":341},[296,2286,2287],{},"    query.bindValue(\":batch\", batchCode);\n",[296,2289,2290],{"class":298,"line":347},[296,2291,2292],{},"    query.exec();\n",[296,2294,2295],{"class":298,"line":353},[296,2296,681],{},[10,2298,2300],{"id":2299},"gdt-hmi-aws-integration","GDT + HMI + AWS Integration",[15,2302,2303,2304,2307,2308,2311,2312,2316],{},"Our ",[28,2305,2306],{"href":30},"GDT"," + ",[28,2309,2310],{"href":35},"HMI"," combination can also send data to the cloud. Details in our ",[28,2313,2315],{"href":2314},"/en/solutions/cloud-iot-data-collection","Cloud & IoT Data Collection"," solution:",[54,2318,2321],{"className":2319,"code":2320,"language":59},[57],"GDT (Modbus) → HMI (Gateway) → MQTT → AWS IoT Core\n",[61,2322,2320],{"__ignoreMap":63},[15,2324,2325],{},"HMI panel:",[2327,2328,2329,2332,2335],"ul",{},[2217,2330,2331],{},"Displays weight locally (Qt/QML interface)",[2217,2333,2334],{},"Publishes to AWS IoT Core (MQTT client)",[2217,2336,2337],{},"Stores in database (SQLite/PostgreSQL)",[10,2339,2341],{"id":2340},"conclusion","Conclusion",[15,2343,2303,2344,22,2346,2348],{},[28,2345,31],{"href":30},[28,2347,36],{"href":35}," integration provides:",[15,2350,2351,2352,2355,2358,2359,2362,2364,2365,2368,2370,2371,2374],{},"✅ Real-time weight monitoring with ",[19,2353,2354],{},"200ms update rate",[2356,2357],"br",{},"\n✅ Modern touchscreen interface with ",[19,2360,2361],{},"Qt/QML",[2356,2363],{},"\n✅ Flexible communication with ",[19,2366,2367],{},"Modbus TCP/RTU",[2356,2369],{},"\n✅ ",[19,2372,2373],{},"Cloud integration"," ready (AWS, Azure)",[277,2376,2378],{"id":2377},"related-resources","Related Resources",[2327,2380,2381,2385,2389,2395],{},[2217,2382,2383],{},[28,2384,31],{"href":30},[2217,2386,2387],{},[28,2388,36],{"href":35},[2217,2390,2391],{},[28,2392,2394],{"href":2393},"/en/blog/embedded-linux-hmi-development-yocto-qt","Embedded Linux HMI Development: Yocto + Qt",[2217,2396,2397],{},[28,2398,2315],{"href":2314},[2400,2401,2402],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":63,"searchDepth":305,"depth":305,"links":2404},[2405,2406,2407,2408,2412,2416,2417],{"id":12,"depth":305,"text":13},{"id":51,"depth":305,"text":52},{"id":66,"depth":305,"text":67},{"id":274,"depth":305,"text":275,"children":2409},[2410,2411],{"id":279,"depth":311,"text":280},{"id":1158,"depth":311,"text":1159},{"id":2199,"depth":305,"text":2200,"children":2413},[2414,2415],{"id":2203,"depth":311,"text":2204},{"id":2237,"depth":311,"text":2238},{"id":2299,"depth":305,"text":2300},{"id":2340,"depth":305,"text":2341,"children":2418},[2419],{"id":2377,"depth":311,"text":2378},"Step-by-step guide for visualizing data from GDT Digital Transmitter on HMI touchscreen with Modbus TCP/RTU protocol in industrial weighing systems.","md",{"date":2423,"author":2424,"readTime":347,"tags":2425},"2025-12-29","Amazeng Technical Team",[2306,2310,2426,2427,2428,2429,2430],"Modbus","Loadcell","Qt","Industrial Weighing","QML","/en/blog/gdt-hmi-integration-modbus-weight-display",{"title":5,"description":2420},"en/blog/gdt-hmi-integration-modbus-weight-display","_zBAhz4pJw9k2b4kX1YxzG1n39nHwxqPQ22nMjN0eis",1778229658615]