ابتدا در سال 1979 توسط Modicon كه امروزه Electric Schneider آن را در بر گرفته عرضه شد . كاربرد اوليه آن براي استفاده در PLC ها بود ولي به تدريج به عنوان يك استاندارد ارتباطي پذيرفته شد و بسياري از سازندگان تجهيزات اتوماسيون آن را پشتيبان كردند بدين ترتيب Modbus بصورت يك استاندارد باز در آمد بگونه اي كه محصولات سازندگان مختلف بسهولت توسط اين پروتكل با يكديگر ارتباط برقرار كردند . سازندگان وسايل كوچك نيز ترجيح دادند اين پروتكل را با ارتباط RS232 يا RS485 روي وسايل خود بكار ببرند تا استفاده از آنها در پروژه هاي بزرگ ميسر گردد.
Modbus به دليل استفاده از لينك هاي سريال RS485/RS232 داراي محدوديت هاي شد كه به برخي از آنها اشاره ميگردد:
• كند بودن خطوط سريال كه بين 9600 تا 115000 بيت در ثانيه كار ميكنند يعني در ماكزيمم حالت 115Mbps.0 كه ايـن سـرعت در مقايسه با شبكه هاي ارتباطي امروزي كه 100Mbps يا حتي چند Gbps سرعت دارند پايين است
• از آنجا كه توسط RS232 فقط دو وسيله و توسط RS458 بين 20 تا 30 وسيله امكان ارتباط دارنـد از اينـرو بـراي ارتبـاط دادن تعـداد زيادي وسايل مثلا 500 وسيله نياز به ارتباط پيچيده درختي شكل است.
• ارتباط سريال Modbus بصورت Slave/Master است بدين معني كه روي باس فقط يك وسيله (Master)اجازه صحبت با گروهي از Slave ها را دارد . (مد باس سيستم Multimaster را ساپورت نمي كند)
با وجود اين محدوديت ها پروتكل Modbus در عرصه اتوماسيون جايگاه ويژه خود را پيدا كرد.
Modbus داراي سه نسخه اصلي زير است كه ويژگي هاي آنها با هم متفاوتند :
• ASCII/RTU Modbus كه بصورت سريال روي RS485 يا RS232 كار ميكند.
• IP/TCP Modbus كه روي اترنت كار ميكند .
• Plus Modbus كه بصورت Pass Token و با سرعت بالا طراحي شده است و يك باس انحصاري است .
در بين پروتكل هاي Modbus آنچه را مي توان در خانواده فيلد باس جاي داد ASCII/RTU Modbus است . اين پروتكل كه نسخه پايه است از دو مد انتقال ASCII و RTU استفاده مي كند .
• ASCII قابل خواندن كه بعنوان مثال براي تست بكار ميرود (فرمت ASCII)
RTU فشرده و سريع كه براي كار نرمال بكار ميرود . ( فرمت هگزادسيمال )
مد RTU كه بعضاً به آن B -Modbus بعنوان Binarry Modbus گفته ميشود مد اصلي است . مدASCII كه بعضاً به آن A -Modbus نيز گفته ميشود براي برخي پيغام ها بكار ميرود اين پيغام ها طول شان دو برابر پيغام هاي RTU مي باشد .
اين پروتكل از لايه هاي 1و2و7 مدل OSI استفاده ميكند . در لايه فيزيكي RS232 و RS485 را بكار مي برد.
RS232 بصورت نقطه به نقطه P-t-P بسته ميشود ولي RS485 علاوه بر P-t-P ميتواند بصورتMultipoint نيز بسته شود يعني چندين دستگاه روي يك باس قرار گيرند . در اين حالت باس معمولا 2 سيمه است اگر چه امكان اتصال 4 سيمه نيز وجود دارد .
در اتصال RS485 چه بصورت دو سيمه و چه بصورت 4 سيمه در نظر داشتن نكات زير ضروري است
• بطور معمول بدون ريپيتر ماكزيمم 32 وسيله را ميتوان روي RS485 Modbus متصل نمود.
• توپولوژي اتصال بصورت Bus است كه ميتواند Tap and Drop یا Daisy Chain باشد .
• طول كابل Trunk محدود است اين محدوديت بستگي به سرعت انتقال ديتا ، مشخصات كابل (از جمله خازن كابل ) ، تعداد Node هاي متصل شده بصورت Daisy Chain و نيز 2 سيمه يا 4 سيمه بودن سيستم دارد . براي سرعت bps 9600 با كابل AWG26 يا ضخيم تر و سيستم 2 سيمه اين طول 1000 متر است . براي سيستم 4 سيمه با مشخصات فوق اين طول به نصف كاهش مي يابد.
• طول كابل انشعابي كوتاه باشد و از 20 متر تجاوز نكند . كلاً اگر n انشعاب وجود داشته باشد براي بدست آوردن ماكزيمم طول هر انشعاب عدد 40 متر را بر n تقسيم ميكنيم.
• سيم مشترک (Common یا GND ) به زمین (PE) متصل شود، ترجیحا در یک طرف و آن هم در سمت Master
• دو طرف كابل Trunk يعني باس اصلي توسط ترمينيتور بسته شود . هر زوج سيم ديتا در دو طرف ترمينيتور لازم دارد پس در سيستم 4 سيمه در هر طرف 2 ترمينيتور لازم است .
• ترمينيتور ميتواند يك مقاومت 150 اهمي باشد . در برخي كاربردها از مقاومت 120 اهمي كه با خازن (10V minimum 1nf) سري شده استفاده مي گردد.
• براي پلاريزه كردن خط از يك جفت مقاومت pull up و pull down كه مقدار آنها مي تواند بين 450 تا 650 اهم باشد در يك طرف ( ترجیحا سمت Master ) استفاده ميگردد . منظور از پلاريزه كردن خط مصون نگه داشتن باس از تداخل و نويز درحالتي است كه روي خط هيچ ديتايي تبادل نميشود
لازم است در اين حالت گيرنده حالت ثابت خود را حفظ كند . مقاومت هاي فوق به تغذيه 5 ولت متصل مي شوند
ماكزيمم وسايل مجاز روي Modbus با پلاريزاسيون به يك چهارم حالت نرمال كاهش مي يابد.
اتصال Modbus به صورت RS232 :
- اين ارتباط بصورت نقطه به نقطه است يعني فقط دو وسيله ميتوانند با هم ارتباط داشته باشند .
- براي مسافت هاي كوتاه ( معمولاً) كمتر از 20 متر بكار مي رود.
• ترمينيتور ندارد .
لايه ديتا لينك ( لايه دوم )
اين لايه از تكنيك دسترسي Slave/Master استفاده ميكند . بنابراين در هر لحظه فقط يك Master ميتواند باس را در اختيار داشته و با ماكزيمم 247 وسيله Slave كه به همان باس متصل هستند ارتباط برقرار كند . بديهي است در اين تكنيك دسترسي Slave ها هيچگاه بدون درخواست Master ديتايي را نميفرستند و هيچگاه نيز با يكديگر ارتباط برقرار نمي كنند .
Master به يكي از دو روش زير درخواست خود را ارسال مي نماید :
مد Unicast :
در اين حالت Master ازSlave خاصي درخواست ديتا مي نمايد . Slave پس از دريافت Request پيام reply را به Master مي فرستد . بديهي است هر Slave بايد داراي آدرس خاص و منحصر بفردي باشد تا Master بتواند با آن ارتباط برقرار كند .
Broadcast :
در اين حالت Master پيام خود را به تمام Slave ها ميفرستد ولي هيچ پاسخي به Master بر نميگردد. اين مد از جمله براي نوشتن فرامین ( Writing Commands ) بهكار ميرود .
براي مد Broadcast آدرس صفر رزرو شده است.
بطور كلي روش آدرس دهي در Modbus مانند جدول بعد است . بايد توجه داشت كه Master نياز به هيچ آدرس خاصي ندارد و صرفاً Slave ها هستند كه نياز به آدرس دارند.
فريم اطلاعات
ديتا هاي ديگري نيز با PDC جمع شده و فريم ديتا را مي سازند . اين فريم در سمت Master ساخته ميشود.
فيلد هاي فريم فوق بشرح ذيل هستند :
- فيلد آدرس صرفا ً حاوي آدرس Slave است و ميتواند بين 1 تا 247 باشد.
Master در ارتباط Unicast آدرس را در فيلد قرار مي دهد و Slave نيز وقتي پاسخ مي دهد آدرس خودش را در فيلد مي گذارد تا Master بفهمد كدام Slave پاسخ داده است .
• فيلد Function Code نشان دهنده عملي است كه بايد انجام شود . (Action )
• فيلد CRC براي Error Checkingاست كه تشريح خواهد شد .
مد هاي انتقال سريال
دو مد در انتقال سريال Modbus وجود دارد كه عبارتند از : ASCII و RTU . اين مدها وضعيت بيت هاي پيام و نحوه بسته بندي و باز شدن بسته پيام رامشخص ميكند . تمام وسايل بايد بتوانند مد RTU را كه مد پيش فرض است بكار ببرند ولي مد ASCII اختياري است .
مد RTU یا Remote Terminal :
در اين مد هر بيت 8 بيت از بايت پيام شامل دو كاراكتر 4 بيتي هگزا دسيمال است . اين ويژگي چگالي ديتا را افزايش داده و باعث مي شود كه نسبت به مد ASCII نرخ تبادل ديتا بهتر باشد . هر پيام بصورت رشته اي از كاراكترها ارسال ميگردد . فرمت 11 بيت بسته ديتا در مد RTU بصورت زير است :
- 1 بیت برای شروع دیتا
- 8بیت برای دیتا
- 1 بیت برای Parity
- 1 بیت برای پایان دیتا
معمولا Parity زوج بصورت پيش فرض مورد استفاده قرار ميگيرد اگرچه Parity فرد يا حتي بدون چك Parity نيز ميتواند بكار رود . حالت اخير براي اطمينان از ماكزيمم سازگاري با محصولات مختلف پيشنهاد ميشود در اين حالت 2 بيت پاياني مورد نياز است شكل زير :
فرمت كلي فريم كه شامل كاراكترهاي مختلف است در مد RTU بصورت زير است . همانطور كه مشاهده ميشود ماكزيمم طول فريم در اين مد برابر 256 بايت مي باشد و ماكزيمم مقدار ديتا 253 بايت است .
بين فريم ها يك فاصله زماني وجود دارد كه حداقل به اندازه 5.3 كاراكتر است و به آن فاصله سكوت نيز ميگويند .
اگر بين دو كاراكتر متوالي يك فريم تاخيري بيش از 1.5 كاراكتر پيش بيايد نشان دهنده اشكال است .
اين فواصل زماني كه به تايمرهاي t1.5 و t3.5 نيز معروف است براي كنترل نياز به وقفه هاي زياد دارد كه در سرعت هاي بالا بار زيادي را به CPU تحميل ميكند و بهتر است در سرعتهاي بالا زمان اين تايمرها فيكس شوند . پيشنهاد ميشود براي براي t1.5 زمان 750 ميكرو ثانيه و براي t3.5زمان 1750 ميلي ثانيه بكار برده شود .
مد انتقال ASCII یا American Standard for Information Interchange :
در اين مد هر 8 بيت از بايت بصورت 2 كاراكتر ASCII ارسال ميشود از اينرو بازدهي آن نسبت به RTU كمتر است بعنوان مثال در اين مد بايت OX5B بصورت 2 بايت يعني “5=”OX35 و “B=”OX42 در مي آيد . يكي از محاسن مد ASCII فاصله زماني بين دو فريم است كه مي تواند تا يك ثانيه باشد اين امر باعث مي شود كه نيازي به سنكرون سازي ايستگاه هاي كاري وجود نداشته باشد . اين مد در جايي كه لينك فيزيكي يا قابليت هاي وسيله اجازه استفاده از مد RTU را نمي دهد ( بويژه از نظر مديريت تايمرها ) استفاده ميگردد . در مد ASCII فرمت 10 بيت هر بسته ديتا بصورت زير است :
- 1 بیت برای شروع
- 7 بیت برای دیتا
- 1 بیت برای Parity
- 1 بیت برای stop
نوع Parity شبيه آنچه براي RTU ذكر شد زوج بوده ولي انواع ديگر نيز قابل استفاده است . نحوه ارسال نيز شبيه RTU است يعني از بيت LSB شروع و تا بيت MSB ادامه مي يابد .
فريم پيامد در مد ASCII
هر فريم ASCII از بخشهايي مانند شكل زير تشكيل شده است :
كاراكتر شروع يك كاراكتر كه Colon ) يعني : ) است و هگز آن 3A است مي باشد . تجهيزات متصل به باس مرتباً باس را براي يافتن اين كاراكتر مانيتور مي كنند . وقتي اين كاراكتر دريافت شد وسيله كاراكتر بعدي را مي گيرد كه آدرس را مشخص ميكند و اگر آدرس به او مربوط بود ساير كاراكترها را دريافت ميكند تا بسته به پايان برسد . كاراكتر پاياني Carriage Retun-Line Feed یا CRLF است كه كد اسكي آن 0D و كد هگز آن0A ميباشد.
بين رشته كاراكترهاي داخل پيام ممكن است فاصله زماني تا يك ثانيه وجود داشته باشد . كاربرد با پيكر بندي Out Time ميتواند مشخص كند كه اگر زمان بيش از يك ثانيه باشد پيام خطا اعلام شود . برخي از شبكه هاي وسيع ممكن است به Out Time بين 4 تا 5 ثانيه نياز داشته باشد . هر بايت ديتا نياز به 2 كاراكتر براي كد كردن ديتا دارد بنابراين براي اطمينان از سازگاري بين مد هاي ASCII و RTU ماكزيمم سايز اختصاص يافته 252*2 كاراكتر است يعني دو برابر سايز ديتاي RTU . بدين ترتيب سايز كل فريم مطابق شكل بالا 513 كاراكتر خواهد بود . كنترل خطا در اين مد توسط LRC انجام ميشود .
فانكشن كدهاي Modbus
در ارتباط Modbus نوع عملي كه بايد انجام شود توسط فانكشن كدها مشخص ميگردد . بعنوان مثال وقتي Master كه بعضاً به آن Client هم گفته ميشود بخواهد از روي Slave كه ممكن است Server هم ناميده شود O/I خاصي را بخواند اين عمل را توسط كد خاصي كه در فيلد فانكشن كد از فريم ديتا قرار مي دهد درخواست ميكند . اين كد براي Slave نيز شناخته شده است از اينرو اطلاعات مورد نظر را با همان فانكشن كد به Master بر ميگرداند.
قبل از اينكه به تشريح فانكشن كدها بپردازيم لازم است نحوه تبادل با Transaction ديتا روي شبكه Modbus تا حدي روشن شود تا جايگاه فانكشن كدها بهتر مشخص گردد . همانطور كه قبلا نيز اشاره شد در فريم ديتا علاوه بر فيلد ديتا فيلد هاي ديگري نيز وجود دارند . اگر فيلدهاي شروع و پايان و فيلد آدرس را در نظر نگيريم با بسته PDU مخفف Protocol Data Unitو بسته ADU مخفف Application Data Unit مانند شكل زير سرو كار داريم
فيلد Function Code يك بايت است كه مي تواند بين 1 تا 255 دسيمال باشد . كدهاي 1 تا 127 براي كار نرمال و كدهاي 128 تا 255 براي پاسخ هاي Exception كه براي شرايط خطا طراحي شده بكار ميرود . فيلد Data در برخي درخواست هاي خاص ممكن است خالي باشد ( طول صفر ) اين در مواردي است كه ارسال Action به تنهايي براي Slave كفايت ميكند و اطلاعات اضافي مورد نياز نيست . وقتي خطايي وجود نداشته باشد Slave در خواست Master را انجام داده و در پاسخ خود به همان كد فانكشن اشاره ميكند اصطلاحا گفته ميشود كه كد فانكشن اكو شده است . ولي وقتي اشكالي وجود داشته باشد و Slave نتواند عمل مورد درخواست Master را انجام دهد در اين حالت پاسخي كه در آن بجاي كد فانكشن كد Exception آمده برگشت داده ميشود تا Master از بروز خطا مطلع شود . شكل هاي بعد اين دو حالت را نمايش ميدهد .
فانكشن كدها را ميتوان به 2 دسته كلي تقسيم كرد :
1.فانکشن های عمومی (Public) :
اين فانكشن ها بصورت استاندارد از قبل تعريف شده هستند و براي مقاصد مشخص مانند خواندن و نوشتن وسيله بكار ميرود.
2.فانکشن های خاص ( User Defined )
این فانكشن ها مي توانند توسط كاربر تعريف شوند و نيازي به تاييد موسسه Modbus.orgندارند ولي بايد توجه داشت كه كدهاي رزرو شده را براي اين فانكشن ها نميتوان استفاده كرد . كد فانكشن هاي كاربر ميتواند در محدوده 65 تا 72 يا 100 تا 110 باشد .