آشنایی با مدباس و جایگاه آن در اتوماسیون صنعتی
امروزه کاربرد شبکههای صنعتی نظیر مدباس بر کسی پوشیده نیست. در گذشته برای ارتباط بین دو دستگاه لازم بود سیگنالهای کنترلی توسط سیمکشی یک به یک به هم متصل شوند (Hardwire)؛ حال اینکه امروزه بهسادگی توسط یک زوج سیم یا فیبر نوری این ارتباط برقرار میشود. این ارتباط در سیستمهای کنترل، مانیتورینگ و سیستمهای کنترل نظارتی SCADA بهوفور مشاهده میشود.
در صنعت از چند نوع شبکه استفاده میشود که برخی از آنها بیشتر مورداستفاده هستند:
- Industrial Ethernet
- Profibus
- Modbus
- Foundation Fieldbus
- ASI
در این قسمت از پروژه های آردوینو سعی داریم به زبان ساده و بهدور از مباحث پیچیدهی شبکه و لایههای نرمافزاری، با آردوینو ارتباط modbus را پیادهسازی کنیم. پس با سیسوگ همراه باشید.
آیا میتوان از آردوینو در صنعت استفاده کرد؟
از گذشته تا کنون هر زمان صحبت از طرح برد کنترلری در زمینهی صنعت میشده است، PLC ها در اوج قله و تقریباً بدون هیچ رقیبی خودنمایی میکردهاند. البته این موفقیت بیدلیل هم نیست.
در نقطهی مقابل، آردوینو یک برد ساده با امکانات محدود، که برای روی میز و کاربردهای آموزشی معرفی شده است. حتی فکر کردن به اینکه یک برد آردوینو بخواهد مثلاً یک کورهی القایی را کنترل و یا مانیتور کند، کمی دور از ذهن است.
حال اگر بخواهیم این کار را بکنیم چطور عمل کنیم؟
در اینجاست که پروتکل مدباس اهمیت خود را نشان میدهد. شاید نتوان به این سادگیها از یک برد آردوینو بهعنوان قلب یک کورهی القایی در توانهای بالا استفاده کرد ولی بهسادگی میتوان از آن در کارهای دیگری مثل مانیتور کردن استفاده کرد.
در این مقاله سعی میکنیم دادههای یک سنسور درجه حرارت را توسط پروتکل مدباس در یک شبکه SCADA توسط آردوینو دریافت کنیم. رجیستر و دادههای سنسور مطابق جدول زیر است:
Command Name | Command Number |
Read Holding Register | 03 |
Write (Preset) Single Register | 06 |
Return Slave ID | 17 |
Address | Bytes | Range | Defaults (°C /°F) | Register and Description |
0 to 3 | 4 | – | – | Serial Number -4 byte value. Read-only |
4 to 5 | 2 | – | – | Serial Version -2 byte value. Read-only |
6 | 1 | 255 | 254 | ADDRESS. Modbus device address |
100 | 2 | 0-1000 | – | ROOM TEMPERATURE reading in DegF |
101 | 2 | 0-600 | – | ROOM TEMPERATURE reading in DegC |
304 | 2 | 0-1000 | – | Relative Humidity reading. Writing a humidity value to the register will do calibration. |
شیلد توسعهی RS232 و RS485 برای آردوینو
برای اینکه بتوان با یک آردوینو با شبکه مدباس ارتباط برقرار کرد میتوان از یکی از شیلدهایی که بستر 232 و یا 485 را فراهم میکنند، استفاده کرد. ما در این پروژه از یک مبدل 485 استفاده کردهایم.
برای این منظور از یک برد آردوینو UNO و یک شیلد توسعه و یک مبدل 485 استفاده شده است.
برای سختافزار 485 میتوانید از شیلدها و مبدلهای موجود در بازار استفاده کنید. در زیر یک شیلد و نقشهی آن و یک مبدل 232 به 485 نشان داده شده است:
سورس برنامهی آردوینو برای ارتباط با پروتکل مدباس
ماژول 485 و سنسور دمای انتخابی خود را متصل کنید و تمام.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <Wire.h> // Cooking API libraries #include <arduinoUtils.h> // Include these libraries for using the RS-485 and Modbus functions #include <arduinoRS485.h> #include <ModbusMaster485.h> #include <SPI.h> // Instantiate ModbusMaster object as slave ID 254 ModbusMaster485 node(254); // Define one address for reading #define address 101 // Define the number of bits to read #define bitQty 2 void setup() { // Power on the USB for viewing data in the serial monitor Serial.begin(115200); // Initialize Modbus communication baud rate // Only allowed in SOCKET1 node.begin(9600); // Print hello message Serial.println("Modbus communication over RS-485"); delay(100); } void loop() { // This variable will store the result of the communication // result = 0 : no errors // result = 1 : error occurred int result = node.readCoils(address,bitQty); if (result != 0) { // If no response from the slave, print an error message Serial.println("Communication error"); delay(1000); } else { // If all OK Serial.print("Read value : "); // Print the read data from the slave Serial.print(node.getResponseBuffer(0)); delay(1000); } Serial.print("\n"); delay(1000); // Clear the response buffer node.clearResponseBuffer(); } |
میتوانید کتابخانهی RS485 را از لینک زیر دانلود کنید:
arduinoRS485-Modbus-library-v0_4.zip
موردی که در شماتیک توجه مرا جلب کرد استفاده از ترانزیستور 8050 جهت قرار دادن آی سی 485 در حالت سند یا ریسیو بدون نیاز به اشغال پایه اضافی میکرو بود
آیا همیشه میشه از این سیمبندی استفاده کرد یا مختص همین کتابخانه هست ؟
سلام من می خواهم با استفاده از محیط آردوینو برای stm32 برنامه بنویسم و پروتکل مودباس را راه اندازی کنم، چه جوری می تونم از این نمونه کد استفاده کنم؟
آیا امکانش هست؟
سلام دوست عزیز
امکان که بله قطعا هست ؛ برای این کار تنها نیازه مقداری از برنامه نویسی C++ سر در بیاورید و توابع مروبط به صفر و یک کردن خروجی را تغییر دهید هم چنین روال های ارسال و دریافت داده سریال را جایگذین کنید.
به همین سادگی 🙂
سلام
ببخشید این زیاد آموزنده نبود و از توابع آماده استفاده شده بود . ای کاش در مورد پکیج بیشتر توضیح میدادید .
مثلا پکیج چند بایت هست
تاخیر بین هر بایت چقدر هست
و …..
ممنون
امم خوب قبول دارم که جزییات زیادی رو نداشت ولی خوب اینطور هم که گفتید نا آموزنده نبود
میتونید با بررسی توابع و البته کد داخلشون جزییاتی که مدنظرتون هست رو پیدا کنید.
سلام
کتابخانه spi ایراد دارد در برنامه
سلام دوست عزیز
متوجه منظورتون نمیشه ، فکر کنم کتابخانه spi از کتابخانه های خود Arduino است.
میشه بگید چه مشکلی داره یا چه خطایی دریافت می کنید.
سلام کتابخانه modbusRS485 کلا مشکل داره و run نمیشه…حتی مثال هاشم اجرا نمیشه.
اگه بگید چه خطایی دریافت میکنید بهتر میشه کمک کرد.
error library SPI mide k mige mojod nist dar soraty k hast…
سلام
احتمال این که به دلیل آپدیت های جدید آردوینو این مشکل پیش اومده باشه هست
باید بررسی کنیم ببینیم مشکل دقیقا چیه
متشکر برای اطلاع رسانی شما
یه سوال اینکه من مدباسو با یه کد دیگه نوشتم روش حل شد الان که فانکشن وصل میکنم که فرکانس رو بخونم تو فرکانس های پایین 3hz و تو فرکانس های بالا(2khz) اختلاف چیزی که می خونم تا 30hz هم میرسه نمیدونید مشکل کجاست؟؟؟
حتی روی سریال خود آردوینو ینو که تست می کنم همین مشکل و دارم.
حتی کد خواندن فرکانس رو با کانتر نوشتم باز همین مشکل هست.
ببخشید متوجه نشدم فرکانس رو به کجا وصل میکنید ؟ چون که مودباس همون سریال خودمون هست یا نهایتا روی شبکه باشه در هر حال نمیتونید بهش فرکناس وصل کنید
پس احتمالا یه ترانسدیوسر برای تبدیل فرکانس به پروتکل مودباس باید داشته باشید.
واقعا جای همچین مطلب بسیار مفید و کاربردی ای در سایت فوق العاده شما خالی بود
احسنت.
سلام
تشکر بابت حسن توجه شما
مطالبتون واقعا ناب و بدردبخور هستند.
با تشکر از زحماتتون
متشکر
از اینکه مطالب مورد توجهتون قرار گرفته خوشحالیم