از پوسته بزرگ آموزش آنلاین دیجی اکادمی رونمایی شد ...

عضویت

اتوماسیون صنعتی با رزبری پای و وب

کارِ weighing_backend_v1.py این است که:

۱. گوش می‌دهد: به پورت USB گوش می‌دهد. ۲. ترجمه می‌کند: آن سیگنال‌های الکتریکی (پروتکل Modbus) را به عدد ریاضی (کیلوگرم) تبدیل می‌کند. ۳. نمایش می‌دهد: عدد وزن را روی صفحه سیاه (ترمینال) می‌نویسد تا تو و کارفرما ببینید.

این کد اگر عدد وزن را پیدا کند، با رنگ سبز فریاد می‌زند!

final_hope.py

stream_listener.py

 

اگر دستگاه در حالت “استریم” باشد، به محض اجرای این کد، اعداد مثل آبشار سرازیر می‌شوند

این کد اتوماتیک تمام سرعت‌ها (BaudRate) و تمام حالت‌ها (Parity) را چک می‌کند و به دستگاه می‌گوید: “آهای! وزنت چنده؟”.

final_connect.py

 

این فایل در واقع «مترجم هوشمند» بین رزبری‌پای و اون برد (CHW110) هست.

کار دقیقش چیه؟ (به زبان ساده)

این کد ۳ تا کار حیاتی انجام میده که هیچ‌کس نمی‌تونه با چشم غیرمسلح انجام بده:

۱. تنظیم موج رادیو (Configuration): یادته چقدر سر سرعت ۳۸۴۰۰ و تنظیمات H و L اذیت شدیم؟ این کد تمام اون تنظیمات رو تو دل خودش داره. به محض اجرا شدن، به پورت USB دستور میده: “آهای پورت! با سرعت ۳۸۴۰۰ و مدل پارتی None تنظیم شو!” این یعنی دیگه نیاز نیست دستی چیزی رو تنظیم کنی.

۲. درخواست دائم (Polling Loop): اون بردِ چینی، تا ازش سوال نپرسی، جواب نمیده (چون Slave هست). این کد یک حلقه بی‌پایان (while True) داره که هر ۰.۲ ثانیه یک بار به برد میگه: “آهای برد! تو خونه شماره ۰ حافظه‌ت چه عددی داری؟” و برد جواب میده: “۱۷۷۳۲”.

۳. جلوگیری از هنگ کردن (Error Handling): اگر وسط کار سیم قطع بشه یا نویز بیفته، برنامه‌های معمولی کرش می‌کنن (بسته می‌شن). اما این کد طوری نوشته شده که اگر سیم قطع شد، نمی‌بنده! بلکه می‌نویسه: “⚠️ ارتباط قطع شد، منتظر اتصال مجدد…” و به محض اینکه سیم رو وصل کنی، دوباره عدد رو نشون میده. این یعنی نرم‌افزار صنعتی.

main_driver.py

 

🔍 تحلیل فنی کد (چرا این کد حرفه‌ای است؟)

۱. جدول تگ (TAG_TABLE):

  • ما آدرس‌ها (0, 2, 10) را در کد پخش و پلا نکردیم. همه را در یک دیکشنری بالا جمع کردیم.

  • اگر فردا کارفرما بگوید “آدرس وزن عوض شد و شد ۵”، تو فقط عدد 0 را در خط ۲۲ تغییر می‌دهی به 5. تمام کد خود به خود درست می‌شود.

۲. توابع جداگانه (Read/Write):

  • طبق درخواست پروژه (“خواندن/نوشتن”)، ما دو متد read_tag و write_tag داریم.

  • حتی اگر الان فقط می‌خوانی، وجود تابع write_tag نشان می‌دهد زیرساخت Backend کامل است.

۳. قابلیت توسعه:

  • این کلاس ModbusDriver را می‌توانی بعداً در فایل گرافیک (GUI.py) ایمپورت کنی و خیلی شیک بنویسی: gui_label.text = driver.read_tag('PV_Weight')

    💻 فایل نهایی Backend: industrial_backend.py

     

    کد کامل Backend + Frontend را یکجا کردم. این برنامه:

    1. وزن را از آدرس ۰ می‌خواند.

    2. روی یک صفحه گرافیکی بزرگ نشان می‌دهد.

    3. دکمه Zero و Tare دارد که طبق جدول تگ‌ها کار می‌کنند.

    📦 فایل نهایی پروژه: HMI_App.py

     

خواندن رجیسترها بر اساس جدول تگ‌ها”. این کد را با نام backend_logic.py ذخیره کن.

این کد ۳ تا کار مهم می‌کند که به کارفرما ثابت می‌کند کار تمام است:

  1. آدرس ۲۳ (وزن) را به صورت Float می‌خواند (نه عدد پرت ۴۹۳۱۱).

  2. آدرس ۳۳ (پارسنگ) و ۳۵ (زیرو) را به عنوان فرمان تعریف می‌کند.

  3. نام‌گذاری‌ها دقیقاً طبق درخواست :

    1. به عددی که جلوی Tag Address 23 می‌نویسد دقت کن.

      • آیا یک عدد اعشاری منطقی (حتی اگر پرت باشد، مثلا 0.0000 یا 12.5432) نشان می‌دهد؟

      • یا باز هم ارور می‌دهد؟

    اگر این کد یک عدد اعشاری نشان داد، یعنی Backend تمام شده است. (چون ما ثابت کردیم می‌توانیم آدرس ۲۳ را طبق فرمت استاندارد بخوانیم).

    backend_logic.py

     

 

نرم‌افزار واقعی که کارفرما بتونه ببینه و باهاش کار کنه. این کد، محصول نهایی فاز ۱ و ۲ هست که شامل موارد زیره:

  • مانیتورینگ: وزن رو از آدرس ۲۳ می‌خونه و بزرگ نشون میده.

  • فرمان: دکمه‌های “پارسنگ” (Tare) و “صفر” (Zero) داره که طبق جدول تگ‌ها کار می‌کنن.

  • ظاهر: یک محیط گرافیکی شیک و صنعتی.
    Final_App.py

 

 

این کد، ترکیبِ «موتوری که روشن کردیم» با «بدنه‌ی گرافیکی» هست. این فایل رو با نام Final_HMI.py. این همون چیزیه که وقتی روی رزبری اجرا بشه، کارفرما میگه: “آهان! دستگاه همینه!”

  • صفحه اصلی (Main): همین که ساختیم (نمایش وزن).

  • صفحه لاگین (Login): چون تگ login_page دیدم.

  • صفحه تنظیمات (Settings): برای تنظیم پارامترها.

  • صفحه کالیبراسیون: برای کالیبره کردن وزن.
    Phase2_UI_Base.py
    Super_HMI.py

 

ی! حالا که ساختار چند صفحه‌ای (Skeleton) رو دیدی، بریم سراغ اصل کاری.

الان می‌خوایم اون “موتور” (Backend) که ساختیم رو وصل کنیم به این “بدنه” (Frontend). من فایل CSV تگ‌ها رو دقیق بررسی کردم و این صفحات رو بر اساس تگ‌های واقعی طراحی کردم:

  1. صفحه اصلی (Main): نمایش وزن (آدرس ۲۳) + دکمه‌های زیرو/پارسنگ (آدرس ۳۳/۳۵).

  2. صفحه تنظیمات (Product Setup):

    • وزن مطلوب (device.desiredWeight – آدرس ۲۵)

    • حد بالا (device.upperLimitWeight – آدرس ۲۷)

    • حد پایین (device.lowerLimitWeight – آدرس ۲۹)

  3. صفحه کالیبراسیون (Calibration):

    • وزنه کالیبراسیون (device.weigher.calibrationWeight – آدرس ۴۸۵)

    • فرمان کالیبره صفر (ZeroCalibrateCommand – آدرس ۳۵)

    • فرمان کالیبره پر (FullscaleCalibrateCommand – آدرس ۱۵)


https://raymand24.com/wp-content/uploads/2026/02/Super_HMI.py

 

Super_HMI_V2.py

 

 

weighing_hmi.py

 

demo

 

 

pip3 install customtkinter

pip3 install customtkinter packaging –break-system-packages

pip3 install customtkinter packaging --break-system-packages
mkdir -p ~/.config/pip printf "[global]\nbreak-system-packages = true" > ~/.config/pip/pip.conf pip3 install customtkinter packaging

11

pip3 install PyQt6 PyQt6-Charts –break-system-packages

 

sudo apt update
sudo apt install python3-pyqt6 python3-pyqt6.qtcharts

 

pip3 install PyQt6 PyQt6-Charts –break-system-packages

 

 

QT_QPA_PLATFORM=xcb python3 1.py

 

 

pip3 install PyQt6 PyQt6-Charts –break-system-packages

industrial_weighing_hmi.py

 

 

sudo apt update
sudo apt install python3-pyqt6 python3-pyqt6.qtcharts

 

pip3 install PyQt6 PyQt6-Charts –break-system-packages

 

python3 industrial_weighing_hmi.py

 

 

 

sudo apt install python3-minimalmodbus python3-serial


Warning: Trying to access array offset on value of type bool in /home3/raymand24/public_html/wp-content/themes/mweb-digiacademy/templates/mweb_single_layout.php on line 112

Warning: Trying to access array offset on value of type bool in /home3/raymand24/public_html/wp-content/themes/mweb-digiacademy/templates/mweb_single_layout.php on line 113

Warning: Trying to access array offset on value of type bool in /home3/raymand24/public_html/wp-content/themes/mweb-digiacademy/templates/mweb_single_layout.php on line 114
ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *