[{"data":1,"prerenderedAt":326},["ShallowReactive",2],{"blog-en-/en/blog/modbus-protocol-integration":3},{"id":4,"title":5,"body":6,"description":312,"extension":313,"meta":314,"navigation":80,"path":322,"seo":323,"stem":324,"__hash__":325},"en_blog/en/blog/modbus-protocol-integration.md","Modbus Protocol Integration in Industrial IoT Systems",{"type":7,"value":8,"toc":300},"minimark",[9,14,18,22,27,30,34,37,41,44,48,51,213,217,220,249,253,280,284,287,290,296],[10,11,13],"h2",{"id":12},"introduction-to-modbus-protocol","Introduction to Modbus Protocol",[15,16,17],"p",{},"Modbus is one of the most widely used protocols in industrial automation systems, developed by Modicon (now Schneider Electric) in 1979 and still going strong today.",[10,19,21],{"id":20},"modbus-variants","Modbus Variants",[23,24,26],"h3",{"id":25},"modbus-rtu","Modbus RTU",[15,28,29],{},"Operates over RS485 or RS232 serial communication. Transmits data in binary format and uses CRC checksum.",[23,31,33],{"id":32},"modbus-tcp","Modbus TCP",[15,35,36],{},"Works over Ethernet networks via TCP/IP. Faster and more reliable than RTU.",[23,38,40],{"id":39},"modbus-ascii","Modbus ASCII",[15,42,43],{},"Transmits data using ASCII characters over serial communication. Easier for debugging but slower than RTU.",[10,45,47],{"id":46},"modbus-rtu-implementation-with-rs485","Modbus RTU Implementation with RS485",[15,49,50],{},"RS485-based Modbus implementation used in our ZMA Data Acquisition system:",[52,53,58],"pre",{"className":54,"code":55,"language":56,"meta":57,"style":57},"language-c shiki shiki-themes github-light github-dark","#define MODBUS_SLAVE_ID 1\n#define BAUD_RATE 9600\n\ntypedef struct {\n    uint8_t slave_id;\n    uint8_t function_code;\n    uint16_t start_address;\n    uint16_t num_registers;\n    uint16_t crc;\n} modbus_request_t;\n\nuint16_t calculate_crc16(uint8_t *buffer, uint8_t length) {\n    uint16_t crc = 0xFFFF;\n    for (uint8_t i = 0; i \u003C length; i++) {\n        crc ^= buffer[i];\n        for (uint8_t j = 0; j \u003C 8; j++) {\n            if (crc & 0x0001) {\n                crc = (crc >> 1) ^ 0xA001;\n            } else {\n                crc >>= 1;\n            }\n        }\n    }\n    return crc;\n}\n","c","",[59,60,61,69,75,82,88,94,100,106,112,118,124,129,135,141,147,153,159,165,171,177,183,189,195,201,207],"code",{"__ignoreMap":57},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,68],{},"#define MODBUS_SLAVE_ID 1\n",[62,70,72],{"class":64,"line":71},2,[62,73,74],{},"#define BAUD_RATE 9600\n",[62,76,78],{"class":64,"line":77},3,[62,79,81],{"emptyLinePlaceholder":80},true,"\n",[62,83,85],{"class":64,"line":84},4,[62,86,87],{},"typedef struct {\n",[62,89,91],{"class":64,"line":90},5,[62,92,93],{},"    uint8_t slave_id;\n",[62,95,97],{"class":64,"line":96},6,[62,98,99],{},"    uint8_t function_code;\n",[62,101,103],{"class":64,"line":102},7,[62,104,105],{},"    uint16_t start_address;\n",[62,107,109],{"class":64,"line":108},8,[62,110,111],{},"    uint16_t num_registers;\n",[62,113,115],{"class":64,"line":114},9,[62,116,117],{},"    uint16_t crc;\n",[62,119,121],{"class":64,"line":120},10,[62,122,123],{},"} modbus_request_t;\n",[62,125,127],{"class":64,"line":126},11,[62,128,81],{"emptyLinePlaceholder":80},[62,130,132],{"class":64,"line":131},12,[62,133,134],{},"uint16_t calculate_crc16(uint8_t *buffer, uint8_t length) {\n",[62,136,138],{"class":64,"line":137},13,[62,139,140],{},"    uint16_t crc = 0xFFFF;\n",[62,142,144],{"class":64,"line":143},14,[62,145,146],{},"    for (uint8_t i = 0; i \u003C length; i++) {\n",[62,148,150],{"class":64,"line":149},15,[62,151,152],{},"        crc ^= buffer[i];\n",[62,154,156],{"class":64,"line":155},16,[62,157,158],{},"        for (uint8_t j = 0; j \u003C 8; j++) {\n",[62,160,162],{"class":64,"line":161},17,[62,163,164],{},"            if (crc & 0x0001) {\n",[62,166,168],{"class":64,"line":167},18,[62,169,170],{},"                crc = (crc >> 1) ^ 0xA001;\n",[62,172,174],{"class":64,"line":173},19,[62,175,176],{},"            } else {\n",[62,178,180],{"class":64,"line":179},20,[62,181,182],{},"                crc >>= 1;\n",[62,184,186],{"class":64,"line":185},21,[62,187,188],{},"            }\n",[62,190,192],{"class":64,"line":191},22,[62,193,194],{},"        }\n",[62,196,198],{"class":64,"line":197},23,[62,199,200],{},"    }\n",[62,202,204],{"class":64,"line":203},24,[62,205,206],{},"    return crc;\n",[62,208,210],{"class":64,"line":209},25,[62,211,212],{},"}\n",[10,214,216],{"id":215},"function-codes","Function Codes",[15,218,219],{},"Most commonly used Modbus function codes:",[221,222,223,231,237,243],"ul",{},[224,225,226,230],"li",{},[227,228,229],"strong",{},"0x03",": Read Holding Registers",[224,232,233,236],{},[227,234,235],{},"0x04",": Read Input Registers",[224,238,239,242],{},[227,240,241],{},"0x06",": Write Single Register",[224,244,245,248],{},[227,246,247],{},"0x10",": Write Multiple Registers",[10,250,252],{"id":251},"practical-application-tips","Practical Application Tips",[254,255,256,262,268,274],"ol",{},[224,257,258,261],{},[227,259,260],{},"Timeout Management",": Set appropriate timeout values for each request",[224,263,264,267],{},[227,265,266],{},"Error Handling",": Properly handle exception codes",[224,269,270,273],{},[227,271,272],{},"Bus Termination",": Use 120Ω resistors at the beginning and end of RS485 line",[224,275,276,279],{},[227,277,278],{},"Address Planning",": Keep slave device addresses organized",[10,281,283],{"id":282},"conclusion","Conclusion",[15,285,286],{},"Modbus protocol continues to be preferred in industrial systems due to its simplicity and reliability. It can also work with modern systems through bridge solutions in IoT integration.",[288,289],"hr",{},[15,291,292],{},[293,294,295],"em",{},"Our ZMA Data Acquisition system easily integrates into your industrial systems with Modbus RTU support. Contact us for detailed information.",[297,298,299],"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":57,"searchDepth":71,"depth":71,"links":301},[302,303,308,309,310,311],{"id":12,"depth":71,"text":13},{"id":20,"depth":71,"text":21,"children":304},[305,306,307],{"id":25,"depth":77,"text":26},{"id":32,"depth":77,"text":33},{"id":39,"depth":77,"text":40},{"id":46,"depth":71,"text":47},{"id":215,"depth":71,"text":216},{"id":251,"depth":71,"text":252},{"id":282,"depth":71,"text":283},"Learn how to integrate the widely used Modbus protocol in industrial automation systems into IoT devices.","md",{"date":315,"author":316,"readTime":96,"tags":317},"2024-06-10","Amazeng Technical Team",[318,319,320,321],"Modbus","IoT","RS485","Industrial Automation","/en/blog/modbus-protocol-integration",{"title":5,"description":312},"en/blog/modbus-protocol-integration","kfT9DkLAs7EP5Dt7P5zaQbWhNdwIqZTXhkWb5va2Jcc",1778229659017]