در این مقاله سعی میکنیم با استفاده از برد آردوینو و کتابخانه Modbus که قبلا در این مورد مقالهای انتشار شده بود، عملا ارتباط با یک نمایشگر صنعتی که امروزه به نام (Human Machine Interface (HMI از آن یاد میشود یک نمونه کد و یکی از کاربردهای ارتباط مدباس را آموزش بدیم که طرفدارهای خاص خودش رو داره.
HMI یا همان نمایشگر های صنعتی امروزه در اکثر دستگاههای بزرگ و کوچک استفاده میشود، که انواع مختلفی از برندها و امکانات متنوع در دنیا هستند و بیشتر پروتکلهای ارتباطی عمومی و پیشرفته در آن لحاظ شده است که میتوان از Rs232 – Modbus – Ethernet – Canbus -Canopen و … در آن نام برد که امروزه تبدیل به وصله جدانشدنی از صنعت و الکترونیک شده است.
هر HMI تنظیمات خاص و نرم افزار خاص خودش را دارد که در این مقاله ما با برند دلتا آموزش خواهیم داد.
همان طور که گفته شد هر برند از HMIها دارای نرمافزار مخصوص خودشان میباشند که در این مبحث قرار هست با HMI دلتا که نسبتا محبوبیت زیادی از لحاظ قیمت و کیفیت و فراوانی دارد را کار بکنیم. نرمافزار مخصوص این برند DOPSoft است که معولا همراه HMI فروشنده در اختیار کاربر قرار میده.
برای شروع در این نرمافزار ابتدا باید، ایجاد فایل جدید و انتخاب نوع نمایشگری که قراره از آن استفاده کرد را تعیین کنیم.
گزینه بعدی انتخاب پروتکل ارتباطی و درگاهی که از آن در برنامه استفاده میشود رو انتخاب میکنیم. (چون در این نمایشگرها اکثرا بیش از یک درگاه و نوع ارتباط ممکن است باشد)
1-نام پورت (LINK NAME) که ما پورت 2 را انتخاب میکنیم.
2-نوع ارتباط کنترلر (CONTROLER) مود باس رو انتخاب میکنیم.
3-اینترفیس و تنظیمات مربوط به نرخ ارسال و دریافت که 485-9600-8-N-1 است رو انتخاب کردیم.
بعد از تنظیمات فوق برنامه آماده طراحی هست که در این مبحث به علت طولانی نشدن موضوع فقط یک افزونه به آن اضافه میکنیم که قراره مقدار یکی از ورودیهای آنالوگ در برد آردوینو را برایمان نمایش بدهد.
همان طور که در تصویر میبینید ما یک نمایشگر عقربهای برای نشان دادن مقدار ورودی آنالوگ برد آردوینو انتخاب کردیم و آدرس ریجستر 10 را بهش دادیم یعنی هر تغییری در مقدار این آدرس از حافظه آردوینو اتفاق بیفتد نمایشگر همان مقدار را برایمان به صورت عقربه نمایش میدهد. مقدار آدرس اسلیو را نیز یک دادیم. (در این آموزش مستر نمایشگر هست و اسلیو برد آردوینو که آدرس یک رو براش اختصاص دادیم که در قسمت نرمافزار برد آردوینو به آن اشاره خواهیم کرد)
خب تا اینجا ما تنظیمات HMI را انجام دادیم و برنامه مربوطه رو روی HMI دانلود میکنیم و کار با نمایشگر تا اینجا به پایان میرسد.
برای ادامه کار ما علاوه بر برد آردوینو نیاز به بستر فیزیکی RS485 داریم که خوشبختانه هم میشه ساخت و هم از ماژولهای آماده استفاده کرد چون بردهای آردوینو فقط بستر RS232 هست که از طریق ماژول مذکور این بستر را مهیا میکنیم. در این پروژه برای سهولت کار ما از ماژول آماده استفاده میکنیم. انواع مختلف این ماژولها در بازار موجود و بسته به سلیقه و نیازمان انتخاب میکنیم.
ماژول فوق بستر مورد نیاز ما را در این پروژه فراهم میکند. پینهای این ماژول عبارتند از:
Vcc و gnd که تغذیه ماژول میباشند 5Vdc
A-B خروجیهای RS485
Di به پین Tx برد آردوینو
Ro به پین Rx برد آردوینو
De-Re پین کنترل ارسال دریافت است که داخل برنامه به آن اشاره خواهیم کرد. این پین وضعیت ماژول را تعیین میکند که در حالت دریافت قرار گیرد یا ارسال اطلاعات از برد.
خب با توجه به مطالب بالا میرسیم به قسمت اصلی کارمان که کدهای مربوط به برد آردوینو است.
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 | #include <ModbusRTUSlave.h> //ورودی آنالوگ که اینجا ما ولوم استفاده میکنیم int sensorPin = A0; //آدرس دیتاها در حافظه #define VIRTUAL_ADDRESS 0 //تعداد ریجستر هایی که بسته به نیاز افزایش یا کاهش میدیم #define DATA_SIZE 100 // آرایه ای که دیتا های ما برای ارسال در آن قرار میگیرد u16 _D[DATA_SIZE]; //آدرس اسلیو #define OUR_ID_AS_A_SLAVE 1 //پین مربوط به کنترل ارسال و دریافت #define PIN_CONNECTED_TO_BOTH_DE_AND_RE 3 ModbusRTUSlave rtu(OUR_ID_AS_A_SLAVE, &Serial, PIN_CONNECTED_TO_BOTH_DE_AND_RE); void setup() { rtu.addWordArea(VIRTUAL_ADDRESS, _D, DATA_SIZE); rtu.begin(9600); } void loop() { // waiting for requests from master // reading and writing _D according to requests from master happens here rtu.process(); //از ورودی آنالوگ خوانده و در ریجستر شماره 10 ذخیره میکنیم _D[10] = analogRead(sensorPin); } |
چند نکته در مورد کد
اول اینکه احتمالا شما هم مثل ما (البته در ابتدای کارمون) دنبال کتابخونه های زیادی برای مدباس در آردوینو گشتید و اونها رو نصب کردید ، اگر هنگام کامپایل به ارور میخورید ممکن هست که آردوینو کتابخونه های قبلی رو با کتابخونه این پروژه اشتباه بگیره که باعث ارور در کامپایل میشه (چیزی که برای ما و چندتا از کاربرهای دیگه اتفاق افتاد) برای همین کتابخونه های مدباس قبلی رو از این مسیر پاک کنید که به مشکل نخورید
1 | C:\Users\yourAccount\Documents\Arduino\libraries |
نکته بعدی هم اینکه در صورتی که از آردوینویی استفاده میکنید که بیش از 1 سریال داره میتونید &Serial رو به مثلا &Serial1 تغییر بدید تا بتونید از سریال اصلی آردوینوتون هم استفاده کنید
لینکهای دانلود
من سعی کردم روی esp8266 اجراش کنم انجام شد ، اما این پیام هم داد…
WARNING: library ModbusRTU_Slave_RS485 claims to run on avr architecture(s) and may be incompatible with your current board which runs on esp8266 architecture(s).
فکر میکنید بدرستی اجرا میشه یا نه؟
سلام دوست عزیز – فکر میکنم این کتابخانه برای بستر avr نوشته شده است و استفاده از آن برای پلتفرم های دیگر نیازمند تغییر در آن است
مهندس درود، بسیار خوب و با جزئیات نوشتی و سپاس از اینکه برای آموحتن این همت رو بخرج دادی. دمت گرم…. در اولین فرصت تست میکنم و نتیجه رو بهتون اعلام خواهم کرد.
با عرض سلام و خسته نباشید
لطفا یه مثال در ارتباط مدباس دیتا از hmi به میکرو ارسال بشه رو هم بزارید باتشکر
سلام دوست عزیز
سعی میکنیم در لیست تولید محتوا قرارش بدیدم
متشکرم از پیگیری شما 🙂
سلام
امکان داره بجای اردوینو ار میکروکنترلر دیگه مثل خانواده picf18 استفاده کنیم ؟
سلام دوست عزیز بله امکانش هست
با سلام، سپاس فراوان از مطلب خوبتون ، بنده پیگیر خطاهای پیش اومده بودم که خداروشکر رفع شد. که با اجازتون عرض میکنم: فایل LinkedList.h در utility نیاز به آپدیت داره ، اتصال A مبدل max485 به D+ و B به D- باید وصل بشه، و در تصویر تنظیمات نرم افزار DOPSOFT در تنظیمات meter در آدرس رجیستر به جای عدد 10 حرف A (در هگزا دسیمال) قرار بگیره. و همچنین من هم مانند شما با تنظیمات پورت 2 HMIجواب گرفتم در پورت 1 RS485 برای بنده جواب نداد. باز هم سپاس بی کران از شما و همکارانتون
ممنون از به اشتراک گذاری تجربیاتتون
سلام والا کامپایل نمیشه اررور داره از این خط ایراد rtu.addWordArea(VIRTUAL_ADDRESS, _D, DATA_SIZE);
وخط قبلی پورت سریال چی کنم
سلام
به DATA_SIZE یه مقدار اولیه بدید قبل این خط مثلا ۱۰
بجای VIRTUAL_ADDRES هم عدد صفر رو بزارید اگه از آردوینو UNO استفاده میکنید بجای Serial1& اون عدد یک رو حذف بکنید و Serial& بزارید
با سلام
همه سیم هارو وصل کردم برنامه هم کامپایل میشه ولی ارتباط نمیگیره با hmi
مشکل چی میتونه باشه؟
درود بر شما.
شماره پین ها احتمالا در برنامه جدید تغییر کرده است که باید آن ها را اصلاح کنید و یا ترتیب سیم ها را اصلاح کنید.
برنامه جدید با برنامه بالا فرق داره اصلا قرار نیس مقدار انالوگ بخونه . فکر کنم ی موضوع رو دقیق تر بزارید خیلی بهتره
از شماره پین هام که حرفی نزنید
سلام ممنون از مطالب خوبی که به اشتراک میذارید این کد برنامه کامپایل نمیشه متاسفانه ممنون میشم اگر بررسی کنید
فکر میکنم کد توسط دوستمون اصلاح شد و اخر مطلب لینک اصلاح شده قرار گرفت – آیا همچنان کامپایل نمیشه ؟
نخیر متاسفانه کامپایل نمیشه
درود بر شما.
لطفا متن خطا رو بفرستید.
بهتره برای بردی که گفته شد یا حداقل بردی که دو تا سریال داشته باشه کامپایل کنید. اگر آردوینو شما فقط یک سریال سخت افزاری داره، Serial1 رو با یک سریال مجازی روی یکی از پایه ها عوض کنید.
سلام
ممنون بابت پیگیری شما
هنگام کامپایل این خظا ها داده میشه
‘u16’ does not name a type
‘u8’ does not name a type
‘_D’ was not declared in this scope
‘_M’ was not declared in this scope
درود بر شما.
به جای u8
uint8_t
و
بجای
u16
uint16_t
قرار بدید ببینید مشکلتون حل نمیشه؟
سلام خدمت شما
ببخشید وقتی برنامه رو کامپایل میکنم این خطا رو میده
‘serial1’ was not declared in this scope
لطفا راهنمایی کنید
این برنامه اصلا کار نمیکنه اصلا مربط به عکس های بالا هم نیست
سلام متن برنامه رو که دادین کامپایل که میکنم ارور زیر رو میده
‘Serial1’ was not declared in this scope
ModbusRTUSlave rtu(OUR_ID_AS_A_SLAVE, &Serial1, PIN_CONNECTED_TO_BOTH_DE_AND_RE);
با تشکر قشقایی
سلام.
احتمالا از آردوینو ای استفاده میکنید که تنها یک پورت سریال دارد، به همین خاطر Serial1 تعریف نشده است. برنامه را برای آردوینو دیگری مثل مگا2560 کامپایل کنید.
با تشکر.
لطفا نوع خطا را بفرستید
ارور کتابخانه میزنه هر دفعه یه اروری میدهد . چطور میتونم با شما ارتباط داشته باشم که عکس هاشو براتون بفرستم
سلام من پروژه تون رو کامپایل میکنم ارور میدهد آیا از درست بودن پروژه مطمعن هستید ؟ راهی هست که من بتوانم با شما ارتباط داشته باشم
فکر نمیکنم پروژه مشکل داشته باشه !!!
چه خطایی دریافت میکنید ؟
اصلا کامپایل نمیشه اخطار میگیره یه تست بکنید
میشه شما کامپایلش کنید
بررسی میکنیم حتما مساله رو
ممنون برای پیگیریتون
پروژه کامل تست شده دوست عزیز لطفا نوع خطایی که دارید را بفرمائید تا بتونم کمکتان بکنم.
Arduino: 1.8.9 (Windows 10), Board: “Arduino Uno”
C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\Amin\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\Amin\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\Amin\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10809 -build-path C:\Users\Amin\AppData\Local\Temp\arduino_build_942531 -warnings=none -build-cache C:\Users\Amin\AppData\Local\Temp\arduino_cache_219790 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avr-gcc.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5 -prefs=runtime.tools.arduinoOTA.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\Amin\Desktop\New folder\SimpleModbus485\SimpleModbus485.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\Amin\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\Amin\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\Amin\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10809 -build-path C:\Users\Amin\AppData\Local\Temp\arduino_build_942531 -warnings=none -build-cache C:\Users\Amin\AppData\Local\Temp\arduino_cache_219790 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avr-gcc.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5 -prefs=runtime.tools.arduinoOTA.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\Amin\Desktop\New folder\SimpleModbus485\SimpleModbus485.ino
Using board ‘uno’ from platform in folder: C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2
Using core ‘arduino’ from platform in folder: C:\Users\Amin\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2
Detecting libraries used…
“C:\\Users\\Amin\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino5/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR “-IC:\\Users\\Amin\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.2\\cores\\arduino” “-IC:\\Users\\Amin\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.2\\variants\\standard” “C:\\Users\\Amin\\AppData\\Local\\Temp\\arduino_build_942531\\sketch\\SimpleModbus485.ino.cpp” -o nul
“C:\\Users\\Amin\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino5/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR “-IC:\\Users\\Amin\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.2\\cores\\arduino” “-IC:\\Users\\Amin\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.8.2\\variants\\standard” “-IC:\\Users\\Amin\\Documents\\Arduino\\libraries\\ModbusRTUSlave” “C:\\Users\\Amin\\AppData\\Local\\Temp\\arduino_build_942531\\sketch\\SimpleModbus485.ino.cpp” -o nul
Multiple libraries were found for “ModbusRTUSlave.h”
Used: C:\Users\Amin\Documents\Arduino\libraries\ModbusRTUSlave
Not used: C:\Program Files (x86)\Arduino\libraries\ModbusRTUSlave
In file included from C:\Users\Amin\Desktop\New folder\SimpleModbus485\SimpleModbus485.ino:1:0:
C:\Users\Amin\Documents\Arduino\libraries\ModbusRTUSlave/ModbusRTUSlave.h:5:10: fatal error: utility/LinkedList.h: No such file or directory
#include “utility/LinkedList.h”
^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Using library ModbusRTUSlave in folder: C:\Users\Amin\Documents\Arduino\libraries\ModbusRTUSlave (legacy)
exit status 1
Error compiling for board Arduino Uno.
هر دفعه یک خطایی میده . میتونم یه راه ارتباطی با شما داشته باشم مصل تلگرام که عکس براتون بفرستم
اجازه بدید بررسی میکنیم .
درود بر شما.
دوست عزیز کد مربوط به راه اندازی مدباس اصلاح گردید.
اقا این کلا یه برنامه دیگس اصلا ربطی به اون بالایی نداره قبلا هم من دیده بودمش من تست هم کردم اصلا وصل نشد به hmi
سلام وقت بخیر.
ضمن تشکر از دقت نظر شما .
هردو برنامه درست بودن تنها نکته ای که هست در استفاده از نوع برد هست .که آدرس سریال پورت رو باید درست بدهیدو در ضمن در برنامه جدید آدرس دهی بیتی هم اضافه شده
عرض سلام و خسته نباشید و تشکر از بابت فایل نحوه ارتباط آردینو و HMI دلتا. در فایل SimpleModbus485.ino که مربوط به برنامه آردینو جهت ارتباط بین اچ ام آی دلتا میباشد شما از کتابخانه ای به نام include ModbusRTUSlave.h استفاده کردید. چگونه و از کدام سایت می توانم این تابع را در کتابخانه آردینو Add کنم ونیز توابع و به دستورات موجود در کتابخانه فوق دسترسی داشته باشم؟ لطفا مرا راهنمایی کنید.در اینترنت جستجو کردم ولی نتیجه ای نگرفتم.
سلام ممنون دوست عزیز . فایل مورد نظر رو بزودی اضافه میکنم
درود بر شما.
دوست عزیز کد مربوط به راه اندازی مدباس اصلاح گردید.
سلام وخدا قوت امید جان عالی بود اگر یک پروژه بزرگتر که از plc وhmi استفاده میشه
رو با اردینو وhmi اموزش بدید عالی میشه. تشکر از اموزشتون
سلام ممنون از توجه شما .
ایده خوبی هست در اولین فرصت نزدیک یک پروژه تقریبا تکمیل و همراه با plc و hmi و Arduino آماده میکنیم .