در یک سیستم اتوماسیون صنعتی، تجهیزات مختلف باید بتوانند اطلاعات را با یکدیگر مبادله کنند. PLC ممکن است نیاز داشته باشد سرعت یک درایو را بخواند، HMI وضعیت متغیرهای PLC را نمایش دهد یا یک سیستم مانیتورینگ دادههای چند تجهیز را جمعآوری کند.
برای انجام این ارتباط، تجهیزات باید از یک روش مشخص و مشترک برای تبادل داده استفاده کنند.
یکی از شناختهشدهترین پروتکلهای ارتباطی در صنعت Modbus است.
Modbus سالهاست در سیستمهای اتوماسیون، PLCها، HMIها، درایوها، کنتورها، Remote I/Oها، تجهیزات اندازهگیری و بسیاری از دستگاههای صنعتی استفاده میشود.
دو شکل بسیار رایج آن عبارتاند از:
Modbus RTU
و
Modbus TCP
اگرچه هر دو بر اساس مدل داده و Function Codeهای Modbus کار میکنند، روش انتقال اطلاعات در آنها متفاوت است.
در این راهنما بررسی میکنیم Modbus چیست، چگونه کار میکند، Coil و Register چه هستند، Function Code چیست، آدرسدهی Modbus چگونه انجام میشود و Modbus RTU چه تفاوتی با Modbus TCP دارد.
Modbus چیست؟
Modbus یک پروتکل ارتباطی در سطح Application است که برای تبادل اطلاعات میان تجهیزات استفاده میشود.
این پروتکل در اصل در سال 1979 توسط Modicon برای استفاده با PLCهای این شرکت معرفی شد و بعدها به یکی از پروتکلهای پرکاربرد در اتوماسیون صنعتی تبدیل شد.
امروزه مشخصات Modbus توسط Modbus Organization منتشر و نگهداری میشود.
به زبان ساده، Modbus مجموعهای از قواعد مشخص میکند تا یک تجهیز بتواند از تجهیز دیگر درخواست اطلاعات کند یا در صورت مجاز بودن مقداری را در آن بنویسد.
برای مثال یک PLC میتواند از یک تجهیز بخواهد:
مقدار رجیستر شماره مشخصی را برای من ارسال کن.
یا یک HMI میتواند درخواست کند:
مقدار این Holding Register را تغییر بده.
Modbus چگونه کار میکند؟
در یک ارتباط Modbus معمولاً یک دستگاه درخواست ایجاد میکند و دستگاه مقصد به آن پاسخ میدهد.
در اصطلاحات فعلی Modbus از واژههای:
Client
و
Server
استفاده میشود.
Client درخواست را ارسال میکند و Server درخواست را پردازش کرده و در صورت امکان پاسخ مناسب را برمیگرداند.
برای مثال:
HMI → Request → PLC
سپس:
PLC → Response → HMI
در این مثال HMI میتواند Client و PLC میتواند Server باشد.
البته نقش دقیق تجهیزات به نحوه پیادهسازی آنها بستگی دارد.
Master و Slave در Modbus چیست؟
در بسیاری از منابع، نرمافزارها و تجهیزات قدیمیتر Modbus هنوز اصطلاحات:
Master
و
Slave
را مشاهده میکنید.
در این مدل، Master ارتباط را آغاز میکند و Slave به درخواست پاسخ میدهد.
در مستندات جدیدتر Modbus، اصطلاحات Client/Server جایگزین این نامگذاری شدهاند.
بنابراین هنگام مطالعه مستندات تجهیزات قدیمی ممکن است با هر دو مجموعه اصطلاح مواجه شوید.
Modbus چه نوع دادههایی دارد؟
یکی از مفاهیم اصلی Modbus، Data Model آن است.
در مدل کلاسیک Modbus چهار فضای اصلی داده وجود دارد:
| نوع داده | دسترسی معمول | اندازه |
|---|---|---|
| Discrete Input | فقط خواندن | 1 bit |
| Coil | خواندن و نوشتن | 1 bit |
| Input Register | فقط خواندن | 16 bit |
| Holding Register | خواندن و نوشتن | 16 bit |
شناخت تفاوت این چهار گروه برای کار با Modbus بسیار مهم است.
Coil در Modbus چیست؟
Coil یک مقدار تکبیتی است که معمولاً قابلیت خواندن و نوشتن دارد.
مقدار آن میتواند:
0
یا:
1
باشد.
از Coil میتوان برای نمایش یا کنترل وضعیتهای گسسته استفاده کرد.
برای مثال:
Motor Start Command
Valve Command
Enable
اما معنای واقعی هر Coil توسط سازنده تجهیز یا برنامه سیستم تعیین میشود.
Discrete Input چیست؟
Discrete Input نیز یک داده تکبیتی است، اما در مدل استاندارد Modbus بهصورت Read-Only در نظر گرفته میشود.
برای مثال ممکن است وضعیتهایی مانند:
Limit Switch
Sensor Status
Fault Input
از این طریق در دسترس باشند.
تفاوت مفهومی مهم:
Coil → Read/Write
Discrete Input → Read Only
Input Register چیست؟
Input Register یک مقدار 16 بیتی Read-Only در مدل داده Modbus است.
این نوع Register معمولاً برای مقادیری استفاده میشود که Client باید آنها را بخواند ولی قرار نیست مستقیماً از طریق آن Register تغییرشان دهد.
برای مثال یک تجهیز اندازهگیری ممکن است اطلاعاتی مانند:
- دما
- فشار
- ولتاژ
- جریان
- مقدار اندازهگیریشده
را در Input Registerهای خود ارائه کند.
اما محل دقیق هر داده کاملاً به Register Map سازنده تجهیز بستگی دارد.
Holding Register چیست؟

Holding Register یکی از پرکاربردترین انواع داده در Modbus است.
هر Holding Register در مدل پایه 16 بیت دارد و قابلیت خواندن و نوشتن دارد.
برای مثال ممکن است برای موارد زیر استفاده شود:
- Setpoint
- Speed Reference
- Configuration
- Status Word
- Counter
- Parameter
اما اینکه یک Register دقیقاً چه معنایی دارد، توسط Modbus بهتنهایی تعیین نمیشود.
سازنده تجهیز ممکن است مشخص کند:
Register 100 = Motor Speed
و سازنده دیگری همان Register را برای دادهای کاملاً متفاوت استفاده کند.
بنابراین برای ارتباط با یک دستگاه واقعی باید Modbus Register Map همان دستگاه را مطالعه کرد.
Register در Modbus چیست؟
Register را میتوان یک محل منطقی برای نگهداری یا ارائه داده در مدل Modbus دانست.
یک Register پایه 16 بیت است.
بنابراین میتواند شامل مقداری مانند:
0 ... 65535
در حالت Unsigned 16-bit باشد.
اما تجهیزات صنعتی فقط دادههای 16 بیتی ساده ندارند.
ممکن است نیاز باشد دادهای مانند:
- Signed Integer
- 32-bit Integer
- Floating Point
- Counter
- Status Word
منتقل شود.
در چنین شرایطی ممکن است چند Register کنار یکدیگر برای نمایش یک مقدار استفاده شوند.
برای مثال یک مقدار 32 بیتی میتواند دو Register 16 بیتی را اشغال کند.
اینجاست که موضوع Word Order و Byte Order اهمیت پیدا میکند.
Function Code در Modbus چیست؟
Modbus باید مشخص کند Client دقیقاً چه عملیاتی از Server میخواهد.
این کار با Function Code انجام میشود.
برای مثال چند Function Code شناختهشده عبارتاند از:
| Function Code | عملیات |
|---|---|
| 01 | Read Coils |
| 02 | Read Discrete Inputs |
| 03 | Read Holding Registers |
| 04 | Read Input Registers |
| 05 | Write Single Coil |
| 06 | Write Single Register |
| 15 | Write Multiple Coils |
| 16 | Write Multiple Registers |
برای مثال اگر Client بخواهد چند Holding Register را بخواند، معمولاً از:
Function Code 03
استفاده میکند.
اگر بخواهد یک Holding Register را بنویسد:
Function Code 06
میتواند استفاده شود.
و برای نوشتن چند Holding Register:
Function Code 16
کاربرد دارد.
بنابراین دانستن فقط شماره Register کافی نیست؛ باید بدانیم چه نوع دادهای است و با چه Function Codeای باید به آن دسترسی پیدا کرد.
آدرسدهی در Modbus چگونه کار میکند؟
این قسمت یکی از مهمترین و در عین حال یکی از گیجکنندهترین بخشهای Modbus است.
ممکن است در دفترچه یک تجهیز با آدرسهایی مانند:
00001
10001
30001
40001
مواجه شوید.
در شیوه مرجع سنتی، این اعداد میتوانند نوع فضای داده را نشان دهند.
بهصورت متداول:
| Reference | نوع داده |
|---|---|
| 0xxxx | Coil |
| 1xxxx | Discrete Input |
| 3xxxx | Input Register |
| 4xxxx | Holding Register |
برای مثال:
40001
معمولاً به اولین Holding Register در شیوه Reference Number اشاره میکند.
اما یک نکته بسیار مهم وجود دارد:
عدد 40001 لزوماً همان عددی نیست که داخل فیلد Address پیام Modbus ارسال میشود.
تفاوت 40001 و Address 0 چیست؟
فرض کنید مستندات یک دستگاه نوشته باشد:
Holding Register 40001
در شیوه مرجع سنتی، این یعنی اولین Holding Register.
اما آدرس داخل PDU پروتکل از صفر شروع میشود.
بنابراین اولین Holding Register میتواند در پیام Modbus دارای Address:
0
باشد.
یعنی در یک نمایش:
Reference = 40001
اما در نمایش دیگری:
Protocol Address / Offset = 0
این دو میتوانند به یک داده اشاره کنند.
پس چرا گاهی نرمافزار عدد 1 میخواهد؟
چون همه نرمافزارها و سازندگان آدرس را به یک شکل نمایش نمیدهند.
یک نرمافزار ممکن است انتظار داشته باشد:
40001
دیگری:
1
و دیگری:
0
وارد شود.
به همین دلیل نباید صرفاً بر اساس ظاهر شماره Register حدس زد.
باید مستندات دستگاه و نرمافزار Client را بررسی کرد.
این اختلاف میان Reference Number، Offset و Protocol Address یکی از رایجترین دلایل خطای ارتباط Modbus است.
Zero-Based و One-Based Addressing چیست؟
وقتی یک سیستم اولین Register را با:
0
نمایش میدهد، معمولاً با نمایش Zero-Based روبهرو هستیم.
وقتی همان اولین Register با:
1
نمایش داده میشود، نمایش One-Based است.
مثلاً ممکن است یک دفترچه بنویسد:
Register 1
اما نرمافزار برای دسترسی به آن انتظار داشته باشد:
Address 0
بنابراین اگر ارتباط برقرار است ولی داده اشتباه خوانده میشود، یکی از اولین مواردی که باید بررسی شود Register Offset است.
مثال ساده خواندن یک Holding Register
فرض کنید دفترچه یک تجهیز نوشته است:
Motor Speed = Holding Register 40010
و فرض کنیم این دفترچه از Reference Number سنتی استفاده میکند.
اگر:
40001 → Address 0
باشد، آنگاه:
40010 → Address 9
خواهد بود.
Client برای خواندن این مقدار میتواند درخواست Read Holding Registers با Function Code 03 و Starting Address مناسب ارسال کند.
اما این تبدیل را نباید بدون بررسی مستندات واقعی دستگاه به همه تجهیزات تعمیم داد.
ممکن است سازنده از شیوه آدرسدهی دیگری استفاده کرده باشد.
Modbus RTU چیست؟

Modbus RTU یکی از رایجترین روشهای استفاده از Modbus روی ارتباط Serial است.
در صنعت، Modbus RTU اغلب روی شبکههای RS-485 دیده میشود.
RS-485 امکان ایجاد شبکه Serial چندنقطهای را فراهم میکند و به همین دلیل برای اتصال چند تجهیز صنعتی بسیار رایج است.
یک معماری ساده میتواند چنین باشد:
PLC → RS-485 → Drive → Meter → Remote I/O
در این شبکه هر Server باید Address مناسب خود را داشته باشد.
Modbus RTU چه تنظیماتی دارد؟
برای اینکه دو تجهیز بتوانند روی Modbus RTU با یکدیگر ارتباط برقرار کنند، پارامترهای Serial آنها باید سازگار باشند.
موارد مهم عبارتاند از:
Baud Rate
سرعت ارتباط Serial.
نمونهها:
9600
19200
38400
115200
البته مقادیر قابل پشتیبانی به تجهیزات بستگی دارند.
Data Bits
در Modbus RTU معمولاً ساختار کاراکتر بر اساس 8 Data Bit است.
Parity
ممکن است تنظیماتی مانند:
Even
Odd
None
وجود داشته باشد.
Stop Bit
تعداد Stop Bit باید مطابق تنظیمات تجهیزات باشد.
Server Address
هر Server در شبکه باید شناسه مناسب خود را داشته باشد.
در مستندات قدیمیتر معمولاً این مورد با نام:
Slave ID
نیز دیده میشود.
اگر Baud Rate یا Parity یا سایر تنظیمات Serial میان دو تجهیز متفاوت باشد، ارتباط بهدرستی برقرار نخواهد شد.
ساختار پیام Modbus RTU چگونه است؟
یک Frame در Modbus RTU بهصورت مفهومی شامل بخشهایی مانند:
Address + Function Code + Data + CRC
است.
Address
مشخص میکند پیام مربوط به کدام Server است.
Function Code
نوع عملیات را مشخص میکند.
مثلاً:
03 = Read Holding Registers
Data
اطلاعات موردنیاز Function را شامل میشود؛ مثلاً Starting Address و تعداد Registerها.
CRC
برای تشخیص خطا در انتقال Frame استفاده میشود.
در Modbus RTU از CRC-16 برای بررسی صحت Frame استفاده میشود.
CRC در Modbus RTU چیست؟
CRC مخفف:
Cyclic Redundancy Check
است.
فرستنده بر اساس محتوای پیام مقدار CRC را محاسبه کرده و آن را همراه Frame ارسال میکند.
گیرنده نیز CRC را محاسبه میکند.
اگر نتیجه با مقدار دریافتشده مطابقت نداشته باشد، Frame معتبر تلقی نمیشود.
CRC کمک میکند خطاهای ایجادشده هنگام انتقال داده شناسایی شوند.
اما CRC یک مکانیزم امنیتی یا رمزنگاری نیست.
RS-485 در Modbus RTU چه نقشی دارد؟
Modbus و RS-485 یک چیز نیستند.
Modbus → Protocol
RS-485 → استاندارد لایه فیزیکی ارتباط الکتریکی
Modbus مشخص میکند پیامها چگونه معنی شوند.
RS-485 مشخص میکند سیگنال الکتریکی چگونه میان تجهیزات منتقل شود.
بنابراین عبارت:
Modbus RTU over RS-485
توصیف دقیقتری از معماری رایج است.
سیمبندی RS-485 چگونه است؟
در شبکههای رایج دو سیمه RS-485، یک زوج سیم برای ارتباط Differential استفاده میشود.
ممکن است ترمینالها با نامهایی مانند:
A / B
یا:
D+ / D-
یا نامگذاریهای دیگری مشخص شوند.
اما یک مشکل مهم وجود دارد:
نامگذاری A و B میان تمام سازندگان همیشه به یک شکل تفسیر نشده است.
بنابراین اتصال صرفاً بر اساس حرف A و B بدون بررسی مستندات تجهیزات میتواند مشکل ایجاد کند.
بهتر است مستندات هر دو دستگاه و تعریف قطبهای Data+ و Data− بررسی شود.
Topology شبکه RS-485
برای RS-485 معمولاً ساختار خطی یا Daisy Chain / Bus مناسبتر از اتصال Star است.
یعنی:
Device 1 → Device 2 → Device 3 → Device 4
به جای اینکه تمام تجهیزات با کابلهای مستقل به یک نقطه مرکزی متصل شوند.
در دو انتهای Bus نیز بسته به سرعت، طول کابل و مشخصات شبکه ممکن است نیاز به Termination باشد.
طراحی فیزیکی صحیح شبکه نقش مهمی در پایداری Modbus RTU دارد.
Modbus TCP چیست؟
Modbus TCP امکان استفاده از Modbus روی شبکههای TCP/IP را فراهم میکند.
در این حالت به جای شبکه Serial معمولاً از Ethernet استفاده میشود.
یک معماری ساده:
HMI → Ethernet Switch → PLC
یا:
SCADA → Ethernet Network → Multiple PLCs
در Modbus TCP هر دستگاه شبکه میتواند دارای IP Address باشد.
Modbus TCP از چه پورتی استفاده میکند؟
پورت شناختهشده Modbus TCP:
TCP Port 502
است.
یعنی یک Modbus TCP Server معمولاً درخواستهای Modbus را روی TCP Port 502 دریافت میکند.
البته در برخی معماریها یا محصولات ممکن است تنظیمات متفاوتی وجود داشته باشد.
ساختار Modbus TCP چگونه است؟
Modbus TCP برخلاف Modbus RTU دارای MBAP Header است.
MBAP مخفف:
Modbus Application Protocol Header
است.
این Header اطلاعاتی برای مدیریت تراکنش Modbus TCP در اختیار پروتکل قرار میدهد.
بهصورت مفهومی:
MBAP Header + Modbus PDU
ارسال میشود.
MBAP Header شامل فیلدهایی مانند:
- Transaction Identifier
- Protocol Identifier
- Length
- Unit Identifier
است.
چرا Modbus TCP از CRC مشابه RTU استفاده نمیکند؟
Modbus RTU در Frame خود CRC دارد.
اما Modbus TCP روی TCP/IP اجرا میشود و از مکانیزمهای تشخیص خطای لایههای زیرین شبکه استفاده میکند.
به همین دلیل CRC مخصوص Modbus RTU در انتهای Modbus TCP ADU قرار نمیگیرد.
این یکی از تفاوتهای ساختاری مهم RTU و TCP است.
Unit Identifier در Modbus TCP چیست؟
در Modbus TCP فیلدی به نام Unit Identifier در MBAP Header وجود دارد.
در ارتباط مستقیم TCP میان Client و Server ممکن است نقش آن محدود باشد.
اما این فیلد در معماریهایی که یک Gateway میان Modbus TCP و یک شبکه دیگر مانند Modbus Serial قرار دارد اهمیت بیشتری پیدا میکند.
برای مثال:
Modbus TCP Client → Gateway → Modbus RTU Device
Gateway میتواند از Unit Identifier برای مشخص کردن دستگاه مقصد در سمت Serial استفاده کند.
تفاوت Modbus RTU و Modbus TCP چیست؟
هر دو از مدل داده و Functionهای Modbus استفاده میکنند، اما روش انتقال آنها متفاوت است.
| ویژگی | Modbus RTU | Modbus TCP |
|---|---|---|
| بستر رایج | Serial | Ethernet / TCP/IP |
| لایه فیزیکی رایج | RS-485 | Ethernet |
| شناسایی دستگاه | Server Address | IP + معماری Modbus TCP |
| Port | ندارد | معمولاً TCP 502 |
| Error Check در ADU | CRC | متکی به TCP/IP/Ethernet |
| Header | RTU framing | MBAP Header |
| سرعت | وابسته به Serial | معمولاً بالاتر |
| زیرساخت | سادهتر | شبکه Ethernet |
| عیبیابی | Serial/Wiring محور | Network/IP محور |
هیچکدام ذاتاً در تمام پروژهها «بهتر» نیستند.
انتخاب به معماری سیستم بستگی دارد.
چه زمانی Modbus RTU انتخاب کنیم؟
Modbus RTU میتواند انتخاب مناسبی باشد زمانی که:
- تجهیزات Serial هستند
- RS-485 در دستگاهها وجود دارد
- شبکه نسبتاً ساده است
- تعداد تجهیزات محدود است
- زیرساخت Ethernet لازم نیست
- فاصله و شرایط پروژه با طراحی RS-485 سازگار است
بسیاری از درایوها، کنتورها، کنترلرهای دما و تجهیزات اندازهگیری هنوز از Modbus RTU پشتیبانی میکنند.
چه زمانی Modbus TCP انتخاب کنیم؟
Modbus TCP میتواند مناسب باشد زمانی که:
- تجهیزات Ethernet دارند
- زیرساخت شبکه صنعتی وجود دارد
- چند PLC یا HMI باید متصل شوند
- سرعت و انعطاف شبکه اهمیت بیشتری دارد
- سیستم باید با شبکههای سطح بالاتر یکپارچه شود
- مدیریت IP-based مطلوب است
اما Ethernet بودن به معنی ساده بودن خودکار طراحی شبکه نیست.
Topology، Switch، IP Planning، Traffic و Cybersecurity همچنان باید مهندسی شوند.
PLC چگونه با Modbus ارتباط برقرار میکند؟
برای ارتباط PLC با یک تجهیز Modbus باید ابتدا مشخص شود PLC چه نقشی دارد.
ممکن است PLC:
Client
باشد و از تجهیزات دیگر اطلاعات بخواند.
یا:
Server
باشد و اطلاعات خود را در اختیار HMI یا سیستم دیگری قرار دهد.
برخی PLCها میتوانند بسته به قابلیت سختافزار و نرمافزار هر دو نقش را پشتیبانی کنند.
مثال
فرض کنیم PLC باید سرعت یک Drive را بخواند.
Drive مستندات Modbus دارد.
در Register Map نوشته شده است:
Actual Speed → Holding Register X
PLC بهعنوان Client درخواست Read Holding Registers ارسال میکند.
Drive پاسخ میدهد.
PLC مقدار دریافتی را پردازش میکند.
اگر PLC بخواهد Speed Reference را تغییر دهد، ممکن است Register دیگری را با Function مناسب بنویسد.
HMI چگونه با PLC از طریق Modbus ارتباط برقرار میکند؟
فرض کنیم HMI از Modbus TCP استفاده میکند.
PLC:
IP = 192.168.1.10
دارد.
HMI به PLC متصل میشود و Tagهای خود را به Registerهای مناسب Map میکند.
برای مثال:
Tank Level → Holding Register 100
Temperature → Input Register 20
Start Command → Coil 5
این فقط یک مثال آموزشی است؛ Addressهای واقعی باید از مستندات یا برنامه PLC استخراج شوند.
وقتی صفحه HMI باز میشود، HMI میتواند مقادیر موردنیاز را بهصورت دورهای از PLC بخواند و روی صفحه نمایش دهد.
Polling در Modbus چیست؟
در بسیاری از پیادهسازیهای Modbus، Client باید برای دریافت داده درخواست ارسال کند.
این فرآیند معمولاً بهصورت دورهای تکرار میشود.
به این رفتار Polling گفته میشود.
مثلاً HMI ممکن است هر چند صد میلیثانیه مجموعهای از Registerها را بخواند.
اما Polling بسیار سریع و غیرضروری میتواند بار ارتباطی را افزایش دهد.
بهتر است دادهها بهصورت منطقی Group شوند و نرخ Update متناسب با نیاز واقعی فرایند انتخاب شود.
برای مثال یک دمای فرایندی شاید نیاز نداشته باشد هر چند میلیثانیه خوانده شود.
Timeout در Modbus چیست؟
پس از ارسال Request، Client برای دریافت Response منتظر میماند.
اگر پاسخ در مدت تعیینشده دریافت نشود، Timeout رخ میدهد.
Timeout میتواند دلایل مختلفی داشته باشد:
- دستگاه خاموش است
- کابل مشکل دارد
- Address اشتباه است
- IP اشتباه است
- Baud Rate متفاوت است
- Server پاسخ نمیدهد
- شبکه شلوغ یا معیوب است
- Port مسدود است
تنظیم Timeout باید با شرایط واقعی شبکه هماهنگ باشد.
Exception Response در Modbus چیست؟
Server همیشه نمیتواند درخواست Client را انجام دهد.
در برخی شرایط به جای پاسخ عادی، Exception Response ارسال میشود.
برای مثال ممکن است Function درخواستشده پشتیبانی نشود یا Address موردنظر معتبر نباشد.
Exception Code میتواند اطلاعاتی درباره نوع مشکل ارائه دهد.
نمونههای شناختهشده:
01 — Illegal Function
02 — Illegal Data Address
03 — Illegal Data Value
04 — Server Device Failure
این پاسخها در عیبیابی Modbus بسیار مفید هستند.
Data Type در Modbus چرا مهم است؟
Modbus Register پایه 16 بیتی است.
اما یک دستگاه ممکن است داده 32 بیتی یا Floating Point ارائه دهد.
فرض کنید دما به شکل Float 32-bit ذخیره شده باشد.
برای این مقدار ممکن است دو Register لازم باشد.
اگر Client این دو Register را بهعنوان دو Integer مستقل تفسیر کند، مقدار صحیح نمایش داده نخواهد شد.
بنابراین علاوه بر Address باید بدانیم:
- Data Type چیست؟
- چند Register استفاده شده؟
- Signed است یا Unsigned؟
- Scaling دارد یا خیر؟
- Byte Order چیست؟
- Word Order چیست؟
Byte Order و Word Order چیست؟
در دادههای چندبایتی یا چندرجیستری ترتیب Byteها و Wordها اهمیت دارد.
دو دستگاه ممکن است یک مقدار 32 بیتی را با ترتیب متفاوت نمایش دهند.
برای همین ممکن است ارتباط برقرار باشد و Registerها نیز خوانده شوند، اما مقدار نهایی کاملاً اشتباه باشد.
برخی نرمافزارها گزینههایی مانند:
- Byte Swap
- Word Swap
- Big Endian
- Little Endian
ارائه میکنند.
اما نباید تنظیمات را با آزمون و خطای تصادفی انتخاب کرد.
ابتدا مستندات دستگاه باید بررسی شود.
Scaling در Modbus چیست؟
همیشه مقدار Register مستقیماً همان مقدار مهندسی نیست.
فرض کنید Register مقدار:
253
را برگرداند.
مستندات ممکن است بگوید:
Scale = 0.1
بنابراین مقدار واقعی:
25.3 °C
است.
یا سرعت ممکن است به شکل:
14500
ذخیره شده باشد و Scale برابر:
0.1 RPM
باشد.
در نتیجه:
1450.0 RPM
خواهد بود.
بدون توجه به Scaling ممکن است داده صحیح دریافت شود ولی به شکل اشتباه تفسیر شود.
مثال عملی ارتباط Modbus
فرض کنیم یک PLC باید دمای یک کنترلر صنعتی را از طریق Modbus RTU بخواند.
مشخصات فرضی دستگاه:
Server Address: 2
Baud Rate: 9600
Parity: Even
Data: 8 bit
و مستندات دستگاه مشخص کرده است که Process Temperature در یک Holding Register مشخص قرار دارد.
PLC ابتدا ارتباط Serial را با پارامترهای سازگار تنظیم میکند.
سپس Request مناسب را برای Server شماره 2 ارسال میکند.
کنترلر Request را دریافت کرده و مقدار Register را برمیگرداند.
PLC مقدار را دریافت میکند.
اگر مستندات Scaling تعریف کرده باشند، مقدار Raw به مقدار مهندسی تبدیل میشود.
سپس PLC میتواند آن را در برنامه استفاده کند یا به HMI نمایش دهد.
خطاهای رایج در Modbus
بخش بزرگی از مشکلات Modbus از چند اشتباه تکراری ایجاد میشوند.
اشتباه در Server Address
در Modbus RTU اگر Client به Address اشتباه درخواست بفرستد، دستگاه موردنظر پاسخ نمیدهد.
Baud Rate متفاوت
مثلاً PLC روی:
9600
و دستگاه روی:
19200
تنظیم شده است.
Parity متفاوت
تنظیم Parity دو طرف باید سازگار باشد.
جابهجایی خطوط RS-485
اختلاف نامگذاری یا اتصال اشتباه زوج Differential میتواند مانع ارتباط شود.
Topology نامناسب
استفاده از Star Wiring، Stubهای طولانی یا Termination نامناسب میتواند باعث مشکلات ارتباطی شود.
Register Offset اشتباه
یکی از رایجترین خطاها:
40001
در برابر:
1
در برابر:
0
است.
Function Code اشتباه
ممکن است Address درست باشد ولی Client با Function Code اشتباه به آن دسترسی پیدا کند.
Data Type اشتباه
Register صحیح خوانده میشود اما نرمافزار آن را با نوع داده اشتباه تفسیر میکند.
Word Order اشتباه
بهخصوص در Float و مقادیر 32 بیتی.
Scaling فراموش شده
مقدار Raw صحیح است ولی تبدیل مهندسی انجام نشده است.
Timeout نامناسب
Timeout بسیار کوتاه میتواند باعث ثبت خطا در شبکهای شود که پاسخ آن کمی دیرتر میرسد.
چگونه شبکه Modbus RTU را عیبیابی کنیم؟
بهتر است عیبیابی مرحلهای انجام شود.
1. تغذیه تجهیزات
مطمئن شوید تمام تجهیزات روشن و فعال هستند.
2. سیمبندی
اتصالات RS-485 و قطببندی را بر اساس مستندات بررسی کنید.
3. پارامترهای Serial
موارد زیر را تطبیق دهید:
- Baud Rate
- Data Bits
- Parity
- Stop Bits
4. Server Address
شناسه دستگاه را بررسی کنید.
5. Function Code
اطمینان حاصل کنید عملیات موردنظر توسط دستگاه پشتیبانی میشود.
6. Register Address
Zero-Based و One-Based بودن نرمافزار را بررسی کنید.
7. Data Type
نوع داده و تعداد Registerها را بررسی کنید.
8. Scaling
ضریب تبدیل را از مستندات بخوانید.
9. Network Physical Layer
Topology، کابل، Shielding و Termination را بررسی کنید.
10. تست حداقلی
به جای خواندن دهها Register، ابتدا یک Register شناختهشده را تست کنید.
این روش معمولاً پیدا کردن مشکل را بسیار سادهتر میکند.
چگونه Modbus TCP را عیبیابی کنیم؟
در Modbus TCP علاوه بر تنظیمات Modbus، زیرساخت Ethernet نیز باید بررسی شود.
IP Address
Client و Server باید آدرسهای صحیح داشته باشند.
Subnet
Subnet Mask و مسیر شبکه باید درست باشند.
Connectivity
ابتدا باید مشخص شود تجهیزات در سطح شبکه به یکدیگر دسترسی دارند یا خیر.
TCP Port
معمولاً Port 502 باید قابل دسترسی باشد.
Unit Identifier
اگر Gateway وجود دارد، Unit Identifier اهمیت بیشتری پیدا میکند.
Register Mapping
برقراری TCP Connection به معنی صحیح بودن Register Address نیست.
ممکن است ارتباط شبکه کاملاً برقرار باشد اما داده اشتباه خوانده شود.
آیا Modbus امن است؟
Modbus کلاسیک در دورهای طراحی شده که شبکههای صنعتی معمولاً ایزولهتر بودند و Cybersecurity امروزی هدف اصلی طراحی پروتکل نبود.
در Modbus TCP معمولی نباید فرض کرد که قابلیتهایی مانند:
- Encryption
- Authentication
- Authorization
بهصورت ذاتی در پروتکل کلاسیک وجود دارند.
به همین دلیل اتصال مستقیم شبکههای کنترل Modbus به شبکههای غیرقابل اعتماد یا اینترنت میتواند خطرناک باشد.
امنیت باید در سطح معماری شبکه نیز طراحی شود.
برای مثال:
- Network Segmentation
- Firewall
- Access Control
- VPN برای دسترسی از راه دور
- محدود کردن مسیرهای شبکه
- Logging و Monitoring
- مدیریت حسابها و تجهیزات
- غیرفعال کردن سرویسهای غیرضروری
میتوانند بخشی از راهکار امنیتی باشند.
Modbus Security چیست؟
برای نیازهای امنیتی جدیدتر، مشخصاتی با عنوان Modbus Security نیز وجود دارد که از TLS و سازوکارهای امنیتی مرتبط استفاده میکند.
اما پشتیبانی از آن را نباید برای همه تجهیزات Modbus فرض کرد.
باید مشخصات دقیق تجهیزات بررسی شود.
آیا Modbus هنوز در صنعت استفاده میشود؟
بله.
با وجود توسعه پروتکلها و شبکههای صنعتی جدیدتر، Modbus همچنان در بسیاری از تجهیزات استفاده میشود.
یکی از دلایل مهم آن سادگی و گستردگی پشتیبانی در تجهیزات مختلف است.
ممکن است در یک پروژه مدرن همچنان تجهیزاتی مانند:
- PLC
- HMI
- Drive
- Power Meter
- Temperature Controller
- Remote I/O
- Gateway
از Modbus RTU یا Modbus TCP استفاده کنند.
بنابراین شناخت Modbus هنوز یکی از مهارتهای کاربردی در اتوماسیون صنعتی است.
Modbus بهتر است یا PROFINET و EtherNet/IP؟
پاسخ واحدی وجود ندارد.
این پروتکلها برای نیازها و معماریهای متفاوتی طراحی شدهاند.
Modbus به دلیل سادگی و پشتیبانی گسترده برای بسیاری از تبادلات داده مناسب است.
پروتکلهایی مانند PROFINET و EtherNet/IP قابلیتها و مدلهای متفاوت و پیشرفتهتری برای اکوسیستمهای اتوماسیون ارائه میکنند.
انتخاب شبکه باید بر اساس مواردی مانند:
- تجهیزات موجود
- Performance
- Real-Time Requirements
- Diagnostics
- Topology
- Integration
- Safety
- Redundancy
- Cybersecurity
- هزینه
انجام شود.
بنابراین صرفاً محبوب بودن یک پروتکل دلیل کافی برای انتخاب آن نیست.
سؤالات متداول درباره Modbus
Modbus چیست؟
Modbus یک پروتکل ارتباطی برای تبادل داده میان تجهیزات است که در سیستمهای اتوماسیون صنعتی بهطور گسترده استفاده میشود.
Modbus RTU چیست؟
Modbus RTU روشی برای انتقال پیامهای Modbus روی ارتباط Serial است و معمولاً در صنعت روی RS-485 استفاده میشود.
Modbus TCP چیست؟
Modbus TCP نسخهای از ارتباط Modbus روی TCP/IP است که معمولاً در شبکههای Ethernet استفاده میشود.
تفاوت Modbus RTU و Modbus TCP چیست؟
Modbus RTU معمولاً روی Serial و RS-485 اجرا میشود و دارای CRC است. Modbus TCP روی TCP/IP و Ethernet اجرا میشود، از MBAP Header استفاده میکند و معمولاً روی TCP Port 502 کار میکند.
Holding Register چیست؟
Holding Register یک داده 16 بیتی در مدل Modbus است که قابلیت خواندن و نوشتن دارد.
Input Register چیست؟
Input Register یک داده 16 بیتی Read-Only در مدل Modbus است.
Coil چیست؟
Coil یک داده تکبیتی Read/Write است که میتواند وضعیت 0 یا 1 داشته باشد.
Function Code 03 چیست؟
Function Code 03 برای Read Holding Registers استفاده میشود.
آدرس 40001 در Modbus چیست؟
در شیوه Reference Number سنتی، 40001 معمولاً به اولین Holding Register اشاره میکند. اما Address داخل پیام پروتکل میتواند صفر باشد. نحوه نمایش آدرس در نرمافزارها متفاوت است و باید مستندات بررسی شود.
چرا Register درست است ولی مقدار اشتباه نمایش داده میشود؟
دلایل احتمالی شامل Data Type، Scaling، Byte Order، Word Order یا Register Offset اشتباه هستند.
Modbus RTU از RS-485 استفاده میکند؟
Modbus RTU میتواند روی Serial اجرا شود و RS-485 یکی از رایجترین بسترهای فیزیکی آن در صنعت است. Modbus و RS-485 یک مفهوم نیستند.
پورت Modbus TCP چیست؟
پورت شناختهشده Modbus TCP، TCP Port 502 است.
آیا Modbus TCP امن است؟
Modbus TCP کلاسیک بهتنهایی نباید یک پروتکل دارای امنیت مدرن فرض شود. امنیت شبکه صنعتی باید با معماری و کنترلهای امنیتی مناسب طراحی شود.
جمعبندی
Modbus یکی از شناختهشدهترین پروتکلهای ارتباطی در اتوماسیون صنعتی است.
این پروتکل به تجهیزات اجازه میدهد بر اساس یک مدل مشخص، دادههایی مانند Coil، Discrete Input، Input Register و Holding Register را مبادله کنند.
دو روش بسیار رایج استفاده از آن عبارتاند از:
Modbus RTU برای ارتباطات Serial، بهخصوص روی RS-485،
و
Modbus TCP برای شبکههای TCP/IP و Ethernet.
برای کار صحیح با Modbus فقط دانستن آدرس Register کافی نیست.
باید مواردی مانند:
Function Code، Register Map، Address Offset، Data Type، Scaling، Byte/Word Order و تنظیمات ارتباطی
نیز بهدرستی مشخص شوند.
در Modbus RTU، تنظیمات Serial و سیمبندی RS-485 اهمیت زیادی دارند.
در Modbus TCP نیز IP Address، Network Configuration، TCP Port و معماری شبکه باید درست طراحی شوند.
یکی از مهمترین نکات هنگام کار با Modbus این است که Register Map و مستندات واقعی دستگاه مرجع اصلی هستند.
اگر این اصل رعایت شود، Modbus میتواند روشی ساده و کاربردی برای ارتباط میان PLC، HMI، Drive، Remote I/O، تجهیزات اندازهگیری و بسیاری از اجزای دیگر یک سیستم اتوماسیون باشد.
