در دنیای مدرن مهندسی ساخت و تولید، دوران محاسبات دستی و تنظیمات سنتی ماشینآلات به سر آمده است. امروزه دستگاههای CNC (کنترل عددی کامپیوتری)، روباتهای جوشکاری و سیستمهای اندازهگیری CMM تماماً بر اساس کدهای برنامهنویسی کار میکنند. نرمافزارهای قدرتمند CAD/CAM مانند SolidWorks، Mastercam و PowerMill نیز در هسته مرکزی خود چیزی جز هزاران خط کد برنامهنویسی نیستند که معادلات پیچیده هندسی را حل میکنند.
هدف از این درس، تبدیل کردن شما به یک مهندس نرمافزار نیست؛ بلکه هدف این است که یاد بگیرید چگونه به عنوان یک «مهندس مکانیک»، از ابزار برنامهنویسی برای حل سریعتر، دقیقتر و ارزانتر مشکلات کارگاه یا کارخانه خود استفاده کنید.
ما در این دوره از محیط Excel VBA استفاده میکنیم. اکسل نرمافزاری است که در هر کارگاهی یافت میشود و زبان برنامهنویسی پشت آن (Visual Basic for Applications) به حدی قدرتمند است که میتواند پیچیدهترین محاسبات سینماتیک، طراحی قید و بند، انتخاب ابزار برشی و حتی تولید مستقیم G-Code برای دستگاه CNC را به صورت خودکار انجام دهد.
📚 فصل اول: مبانی منطق، الگوریتم و فلوچارت
پیش از آنکه دست به کیبورد ببریم و کدی بنویسیم، باید یاد بگیریم چگونه مانند یک کامپیوتر فکر کنیم. کامپیوترها به شدت سریع، اما کاملاً بیمنطق هستند. آنها فقط دستوراتی را اجرا میکنند که ما با دقت و مرحله به مرحله به آنها داده باشیم.
۱-۱. الگوریتم چیست؟
الگوریتم (Algorithm) مجموعهای از دستورالعملهای متناهی، دقیق و بدون ابهام است که برای حل یک مسئله خاص طراحی شده است.
در مهندسی ساخت، ما هر روز از الگوریتمها استفاده میکنیم. به عنوان مثال، “دستورالعمل راهاندازی دستگاه تراش” یک الگوریتم است:
شروع
بررسی سطح روغن دستگاه.
بستن قطعه کار در سهنظام و آچارکشی.
انتخاب ابزار مناسب و بستن روی تارت.
روشن کردن اسپیندل با دور مناسب.
نزدیک کردن ابزار به قطعه و مماس کردن (Zero Point).
پایان.
ویژگیهای یک الگوریتم خوب:
نقطه شروع و پایان مشخص: هیچ برنامهای نباید تا بینهایت در خلأ رها شود.
دقت: دستور «کمی بار بده» برای کامپیوتر بیمعنی است. باید بگوییم «مختصات Z را ۲ میلیمتر کاهش بده».
ترتیب منطقی: نمیتوان قبل از روشن کردن اسپیندل، باربرداری را شروع کرد.
۱-۲. مثال مهندسی: الگوریتم محاسبه سرعت برشی
فرض کنید میخواهیم برنامهای بنویسیم که قطر قطعه کار و دور بر دقیقه (RPM) را بگیرد و سرعت برشی (Cutting Speed) را حساب کند.
فرمول ریاضی:
\[V_c = \frac{\pi \times D \times N}{1000}\]
در این فرمول \(V_c\) سرعت برشی (متر بر دقیقه)، \(D\) قطر قطعه (میلیمتر) و \(N\) سرعت دوران (دور بر دقیقه) است.
الگوریتم برنامه:
شروع.
مقدار عدد پی (\(\pi\)) را برابر ۳.۱۴۱۵ قرار بده.
مقدار قطر (\(D\)) را از کاربر دریافت کن.
مقدار دور (\(N\)) را از کاربر دریافت کن.
حاصلضرب \(\pi \times D \times N\) را محاسبه کن و بر ۱۰۰۰ تقسیم کن.
جواب را در متغیری به نام \(V_c\) ذخیره کن.
مقدار \(V_c\) را روی صفحه نمایش بده.
پایان.
۱-۳. فلوچارت (روندنما)
فلوچارت نمایش تصویری الگوریتم است. برنامهنویسان حرفهای قبل از نوشتن پروژههای بزرگ، ابتدا فلوچارت آن را رسم میکنند. در فلوچارت از اشکال هندسی استاندارد استفاده میشود:
بیضی: برای شروع و پایان.
متوازیالاضلاع: برای دریافت اطلاعات (ورودی) یا نمایش اطلاعات (خروجی).
مستطیل: برای انجام محاسبات ریاضی و عملیات اجرایی.
لوزی: برای شرطها و تصمیمگیریها (آیا قطر از ۵۰ بیشتر است؟ بله/خیر).
(تمرین کلاسی: دانشجویان فلوچارت فرآیند قلاویزکاری دستی را با استفاده از اشکال هندسی رسم کنند).
📚 فصل دوم: آشنایی با محیط Excel VBA و طراحی رابط کاربری (UI)
اکنون که با منطق حل مسئله آشنا شدیم، وارد محیط نرمافزار میشویم. ما قصد داریم به جای استفاده از سلولهای ساده اکسل، نرمافزارهای کوچک با پنجرههای اختصاصی تولید کنیم.
۲-۱. فعالسازی تب Developer (توسعهدهنده)
به صورت پیشفرض، منوی برنامهنویسی در اکسل پنهان است تا کاربران عادی کدهای سیستمی را تغییر ندهند. برای فعالسازی آن:
نرمافزار Excel را باز کنید.
از منوی File به بخش Options بروید.
در پنجره باز شده، از سمت چپ گزینه Customize Ribbon را انتخاب کنید.
در لیست سمت راست، تیک گزینه Developer را فعال کنید و OK را بزنید.
۲-۲. ورود به آزمایشگاه برنامهنویسی (VBA IDE)
حالا در منوی بالای اکسل تب Developer را میبینید. روی آیکون Visual Basic کلیک کنید (یا کلیدهای میانبر Alt + F11 را فشار دهید).
پنجرهای باز میشود که به آن IDE (محیط توسعه یکپارچه) میگویند. این محیط کارگاه ماشینکاری ما در دنیای کامپیوتر است!
بخشهای مهم محیط VBA:
پنجره Project Explorer: (سمت چپ بالا) مانند درختواره فایلهاست. شیتهای اکسل و فرمهایی که میسازیم اینجا قرار میگیرند.
پنجره Properties (خصوصیات): (سمت چپ پایین) یکی از مهمترین بخشهاست. هر چیزی که در برنامه میسازیم (دکمه، فرم، کادر) یک سری خصوصیات دارد مثل رنگ، اندازه و نام.
محیط Code Window: (پنجره بزرگ وسط) جایی که کدهای برنامه را تایپ میکنیم.
۲-۳. ساخت اولین فرم (UserForm)
ما میخواهیم پنجرهای بسازیم که کاربر بتواند اعداد را در آن وارد کند.
در محیط VBA، از منوی بالا روی Insert کلیک کرده و UserForm را انتخاب کنید.
یک پنجره خاکستری رنگ ظاهر میشود. همچنین جعبه ابزاری به نام Toolbox نمایش داده میشود.
معرفی ابزارهای Toolbox:
Label (برچسب – نماد A): برای نوشتن متنهای راهنما. کاربر نمیتواند این متن را تغییر دهد. (مثلاً نوشتن کلمه “شعاع را وارد کنید”).
TextBox (جعبه متن – نماد ab): کادری سفید رنگ که کاربر نرمافزار، اعداد یا حروف را داخل آن تایپ میکند. این پل ارتباطی ما با کاربر است.
CommandButton (دکمه فرمان – نماد مستطیل برجسته): دکمهای که کاربر پس از وارد کردن اعداد روی آن کلیک میکند تا محاسبات آغاز شود.
۲-۴. اصول نامگذاری استاندارد (بسیار مهم)
وقتی یک TextBox روی فرم میگذارید، کامپیوتر به صورت خودکار نام آن را TextBox1 میگذارد. اگر ۱۰ کادر داشته باشیم، نامها TextBox1 تا TextBox10 خواهند بود. هنگام برنامهنویسی گیج میشویم که کدام کادر مربوط به سرعت بود و کدام مربوط به قطر!
لذا از قانون نامگذاری پیشوندها استفاده میکنیم. روی هر ابزار کلیک کنید و در پنجره Properties، خاصیت (Name) را تغییر دهید:
برای کادرهای متن پیشوند txt بگذارید. مثال: txtDiameter (کادر قطر)
برای دکمهها پیشوند btn بگذارید. مثال: btnCalculate (دکمه محاسبه)
برای برچسبها پیشوند lbl بگذارید. مثال: lblResult (برچسب نتیجه)
(نکته: خاصیت Name با خاصیت Caption تفاوت دارد. Name نام مخفی ابزار برای برنامهنویس است، اما Caption متنی است که کاربر روی آن ابزار میبیند).
📚 فصل سوم: متغیرها (Variables) و مدیریت حافظه (RAM)
فرض کنید به عنوان انباردار یک کارخانه انتخاب شدهاید. قطعات مختلفی (پیچ، مهره، ورق فولادی، روغن) به انبار میآیند. شما نمیتوانید روغن را در قفسه توری، یا ورق فولادی را در بشکه بریزید! هر مادهای به محفظه مخصوص خود و برچسب نام نیاز دارد.
در برنامهنویسی، حافظه RAM کامپیوتر همان انبار ماست. متغیرها، ظرفهایی هستند که ما در این انبار میسازیم تا دادهها را در طول اجرای برنامه در آنها نگه داریم.
۳-۱. انواع دادهها (Data Types)
بسته به اینکه چه چیزی را میخواهیم ذخیره کنیم، باید نوع متغیر را به درستی انتخاب کنیم تا حافظه کامپیوتر هدر نرود.
نوع Integer (عدد صحیح):
برای ذخیره اعداد بدون اعشار در محدوده \(-32,768\) تا \(+32,767\) استفاده میشود. ۲ بایت از حافظه را اشغال میکند.
کاربرد در مهندسی: تعداد دندانههای یک چرخدنده، تعداد سوراخهای فلنج، تعداد پاسهای ماشینکاری.
نوع Long (عدد صحیح بزرگ):
اگر عدد صحیح ما بزرگتر از ۳۲ هزار بود، از این نوع استفاده میکنیم. ۴ بایت اشغال میکند.
کاربرد: شمارش تعداد قطعات تولیدی در طول یک سال.
نوع Single و Double (اعداد اعشاری):
برای اعدادی که نیاز به دقت اعشاری دارند. Double دقت بسیار بالاتری دارد (تا ۱۵ رقم اعشار) و در محاسبات مهندسی ما همیشه از Double استفاده میکنیم. ۸ بایت اشغال میکند.
کاربرد: مختصات دقیق \(X\) و \(Y\) برای دستگاه CNC، محاسبه تلرانسها، سرعتها.
نوع String (رشته متنی):
برای ذخیره حروف، کلمات و جملات. این نوع داده نمیتواند در عملیات ریاضی شرکت کند.
کاربرد: نام اپراتور دستگاه، کدهای G-Code مانند “G01 X20 Y30”.
نوع Boolean (منطقی):
فقط میتواند دو حالت داشته باشد: True (درست/روشن) یا False (غلط/خاموش).
کاربرد: آیا پمپ آبصابون روشن است؟ (بله/خیر).
۳-۲. نحوه تعریف متغیرها (دستور Dim)
برای ساختن یک متغیر در زبان بیسیک، از کلمه کلیدی Dim (مخفف Dimension) استفاده میکنیم.
ساختار کلی:
Dim [نام متغیر] As [نوع داده]
مثال:
Dim ToolNumber As Integer ' متغیری برای ذخیره شماره ابزار
Dim SpindleSpeed As Double ' متغیری برای ذخیره سرعت دوران
Dim OperatorName As String ' متغیری برای ذخیره نام اپراتور
۳-۳. انتساب مقدار به متغیر
پس از ساخت ظرف، حالا باید درون آن چیزی بریزیم. این کار با علامت مساوی = انجام میشود. دقت کنید که در برنامهنویسی، علامت مساوی به معنای “برابری ریاضی” نیست، بلکه به معنای “ریختن مقدار سمت راست به درون متغیر سمت چپ” است.
ToolNumber = 5
SpindleSpeed = 1250.75
OperatorName = "Ali Rezaei" ' متون باید حتماً داخل کوتیشن " " قرار بگیرند
⚙️ پروژه عملی ۱: نرمافزار محاسبه حجم و وزن شمش استوانه
شرح مسئله:
میخواهیم برنامهای بنویسیم که قطر (\(D\)) و طول (\(L\)) یک شمش استوانهای از جنس فولاد را به میلیمتر بگیرد، حجم آن را حساب کرده و با توجه به چگالی فولاد (\(7.85 \text{ g/cm}^3\))، وزن نهایی قطعه را به کیلوگرم به ما اعلام کند. این برنامه برای محاسبه وزن مواد خام در کارگاه ریختهگری یا تراشکاری بسیار حیاتی است.
فرمولها:
شعاع: \[R = D / 2\]
حجم استوانه به سانتیمتر مکعب: \[Volume = \pi \times \left(\frac{R}{10}\right)^2 \times \left(\frac{L}{10}\right)\]
وزن به کیلوگرم: \[Weight = \frac{Volume \times 7.85}{1000}\]
مراحل ساخت رابط کاربری (UI):
یک UserForm ایجاد کنید.
دو Label برای راهنمایی کاربر (متن: “قطر شمش (mm):” و “طول شمش (mm):”) قرار دهید.
دو TextBox مقابل آنها قرار دهید. نام اولی را txtD و دومی را txtL بگذارید.
یک CommandButton با نام btnCalc و متن “محاسبه وزن” در پایین فرم قرار دهید.
کدنویسی:
روی دکمه “محاسبه وزن” دبلکلیک کنید تا وارد محیط کدنویسی شوید. کدهای زیر را با دقت و خط به خط بنویسید (متنهای سبز رنگ که با آپوستروف ‘ شروع شدهاند، توضیحات برنامه هستند و کامپیوتر آنها را اجرا نمیکند. نوشتن توضیحات، عادت مهندسان حرفهای است).
Private Sub btnCalc_Click()
' -- مرحله 1: تعریف متغیرهای مورد نیاز --
Dim D As Double, L As Double
Dim R As Double
Dim Vol As Double
Dim Weight As Double
Dim Pi As Double
' مقداردهی ثابت پی
Pi = 3.141592
' -- مرحله 2: دریافت اطلاعات از رابط کاربری --
' دستور Val متن داخل کادر را به عدد خالص تبدیل میکند تا از خطا جلوگیری شود
D = Val(txtD.Text)
L = Val(txtL.Text)
' -- مرحله 3: انجام محاسبات هندسی و فیزیکی --
R = D / 2
' محاسبه حجم (چون ابعاد به میلیمتر گرفته شده، برای تبدیل به سانتیمتر مکعب تقسیم بر 10 میکنیم)
Vol = Pi * (R / 10) ^ 2 * (L / 10)
' محاسبه وزن فولاد به کیلوگرم
Weight = (Vol * 7.85) / 1000
' -- مرحله 4: نمایش خروجی به کاربر --
' دستور Round خروجی را تا 2 رقم اعشار گرد میکند
MsgBox "وزن شمش فولادی برابر است با: " & Round(Weight, 2) & " کیلوگرم", vbInformation, "نتیجه محاسبه"
End Sub
تحلیل فنی کد (کالبدشکافی کد):
Val( ): کاربران ممکن است به جای عدد 50، اشتباهاً بنویسند “50mm”. اگر بخواهیم حروف را ضرب و تقسیم کنیم برنامه Crash میکند (هنگ میکند). تابع Val حروف اضافه را حذف کرده و فقط عدد را استخراج میکند.
عملگر ^: در محیط VBA برای به توان رساندن اعداد از علامت ^ (Shift+6) استفاده میشود. R^2 یعنی شعاع به توان ۲.
عملگر &: این عملگر برای «چسباندن» استفاده میشود. در خط آخر، ما یک متن ثابت (“وزن شمش…”) را به یک متغیر عددی (Weight) و سپس به کلمه (” کیلوگرم”) چسباندهایم تا جمله کاملی ساخته شود.
🛠 خطایابی (Debugging):
اگر هنگام اجرای برنامه با خطای Type Mismatch مواجه شدید، به این معنی است که سعی کردهاید متن را در ظرفی که برای اعداد ساخته شده (Dim ... As Double) بریزید. حتماً چک کنید که از دستور Val استفاده کرده باشید.
تمرینات پایان فصل سوم:
برنامهای بنویسید که طول، عرض و ضخامت یک مکعب مستطیل را بگیرد و حجم آن را محاسبه کند.
فرمول محاسبه سرعت پیشروی ماشینکاری به این صورت است: \[F = N \times f_z \times Z\] که در آن \(N\) دور اسپیندل، \(f_z\) بار به ازای هر دندانه و \(Z\) تعداد دندانههای ابزار است. برنامهای با سه TextBox بنویسید که این مقادیر را گرفته و سرعت پیشروی (\(F\)) را محاسبه کند. برای هر متغیر چه نوع دادهای (Data Type) انتخاب میکنید؟
📚 فصل چهارم: ساختارهای تصمیمگیری (هوشبخشیدن به برنامه)
در فصلهای قبل، برنامههایی نوشتیم که خط به خط از بالا به پایین اجرا میشدند. اما در دنیای واقعی مهندسی، ما همیشه نیاز به تصمیمگیری داریم.
به عنوان یک بازرس کنترل کیفیت (QC)، وقتی قطعهای را با میکرومتر اندازه میگیرید، از خود میپرسید: “آیا این اندازه در محدوده تلرانس مجاز هست یا خیر؟” اگر بله، قطعه تایید میشود؛ اگر خیر، قطعه یا باید دوباره ماشینکاری شود (Rework) و یا کاملاً ضایعات (Scrap) است.
برای اینکه کامپیوتر هم بتواند چنین تصمیماتی بگیرد، از دستورات شرطی استفاده میکنیم. معروفترین دستور شرطی در تمام زبانهای برنامهنویسی، دستور If (اگر) است.
۴-۱. عملگرهای مقایسهای (Relational Operators)
برای ساختن یک شرط، ما باید دو چیز را با هم مقایسه کنیم. در زبان VBA از علامتهای زیر استفاده میشود:
= : مساوی است با
<> : نامساوی است (در ریاضی \(\neq\))
> : بزرگتر است از
< : کوچکتر است از
>= : بزرگتر یا مساوی است با
<= : کوچکتر یا مساوی است با
۴-۲. عملگرهای منطقی (Logical Operators)
گاهی اوقات شرط ما ترکیبی است. مثلاً: “قطر باید از ۲۴.۹۸ بزرگتر و از ۲۵.۰۲ کوچکتر باشد.”
And (و): زمانی شرط برقرار است که هر دو طرف درست باشند.
Or (یا): زمانی شرط برقرار است که حداقل یکی از طرفین درست باشد.
Not (نقیض): نتیجه شرط را برعکس میکند (درست را به غلط و بالعکس تبدیل میکند).
۴-۳. ساختار دستور If – Then – Else
قالب کلی دستور شرطی به شکل زیر است:
If [شرط یا مقایسه] Then
' کارهایی که اگر شرط درست بود باید انجام شود
ElseIf [شرط دوم در صورت غلط بودن شرط اول] Then
' کارهایی که اگر شرط دوم درست بود انجام شود
Else
' کارهایی که اگر هیچکدام از شروط بالا درست نبود انجام شود
End If
⚙️ پروژه عملی ۲: دستیار هوشمند کنترل کیفیت (تلرانسسنج)
شرح مسئله:
یک شفت فولادی باید با قطر اسمی \(25 \text{ mm}\) تولید شود. نقشه مهندسی، تلرانس را \(25 \pm 0.05\) تعیین کرده است. ما میخواهیم نرمافزاری بسازیم که اندازه اندازهگیری شده توسط اپراتور را بگیرد و به او بگوید که قطعه در چه وضعیتی است.
حالت اول: اندازه بین \(24.95\) و \(25.05\) است \(\rightarrow\) قطعه تایید است.
حالت دوم: اندازه بزرگتر از \(25.05\) است \(\rightarrow\) قطعه گوشت اضافه دارد و قابل اصلاح (ماشینکاری مجدد) است.
حالت سوم: اندازه کوچکتر از \(24.95\) است \(\rightarrow\) قطعه لاغر شده و ضایعات است.
مراحل ساخت رابط کاربری (UI):
یک UserForm جدید بسازید.
یک TextBox برای دریافت اندازه قطعه (با نام txtMeasure) قرار دهید.
یک CommandButton برای بررسی وضعیت (با نام btnCheck) قرار دهید.
یک Label بزرگ در پایین فرم با نام lblResult قرار دهید تا نتیجه را با رنگهای مختلف در آن نشان دهیم.
کدنویسی:
Private Sub btnCheck_Click()
Dim Measure As Double
Dim UpperLimit As Double, LowerLimit As Double
' تعریف حدود مجاز بر اساس نقشه
UpperLimit = 25.05
LowerLimit = 24.95
' دریافت اندازه قطعه از اپراتور
Measure = Val(txtMeasure.Text)
' بررسی شرطها
If Measure >= LowerLimit And Measure <= UpperLimit Then ' اگر قطعه تایید بود lblResult.Caption = "قطعه تایید شد (OK)" lblResult.BackColor = vbGreen ' تغییر رنگ پسزمینه برچسب به سبز ElseIf Measure > UpperLimit Then
' اگر قطعه گوشت اضافه داشت
lblResult.Caption = "نیاز به ماشینکاری مجدد (Rework)"
lblResult.BackColor = vbYellow ' تغییر رنگ به زرد
ElseIf Measure < LowerLimit Then
' اگر قطعه لاغر شده بود
lblResult.Caption = "قطعه ضایعات است (Scrap)!"
lblResult.BackColor = vbRed ' تغییر رنگ به قرمز
End If
End Sub
کالبدشکافی کد:
vbGreen, vbRed: در محیط VBA، رنگهای پایه به صورت کلمات از پیش تعریف شده (Constants) وجود دارند. با تغییر خاصیت BackColor (رنگ پسزمینه) توانستیم یک آلارم بصری عالی برای اپراتور دستگاه طراحی کنیم تا با یک نگاه متوجه وضعیت قطعه شود.
اهمیت ترتیب شروط: نرمافزار خطوط را از بالا به پایین میخواند. به محض اینکه یکی از شرطها درست باشد، وارد آن میشود و بقیه ElseIf ها را نادیده میگیرد و مستقیماً به End If میپرد.
تمرینات پایان فصل چهارم:
الگوریتم و فلوچارت برنامه بالا (کنترل تلرانس) را روی کاغذ رسم کنید.
برنامهای بنویسید که سرعت اسپیندل (RPM) را دریافت کند. اگر سرعت بالای \(3000\) بود، پیام دهد “خطر: دور بحرانی! آیا از سیستم آبصابون فشار قوی استفاده میکنید؟” در غیر این صورت پیام دهد “دور نرمال است.”
📚 فصل پنجم: حلقههای تکرار (اتوماسیون کارهای خستهکننده)
یکی از بزرگترین مزیتهای کامپیوترها این است که هرگز خسته نمیشوند! فرض کنید میخواهید روی یک صفحه فلزی، ۱۰۰ سوراخ به فاصله مساوی متهکاری کنید. اگر بخواهید مختصات مرکز این ۱۰۰ سوراخ را با ماشینحساب حساب کنید و روی کاغذ بنویسید، حداقل یک ساعت زمان میبرد و احتمال خطای انسانی بسیار بالاست.
در برنامهنویسی، ابزاری به نام حلقه (Loop) وجود دارد که یک فرمول یا یک کار را هزاران بار در کسری از ثانیه تکرار میکند.
۵-۱. ساختار حلقه For – Next
پرکاربردترین حلقه در محاسبات مهندسی، حلقه For است. ما از این حلقه زمانی استفاده میکنیم که دقیقاً میدانیم یک کار چند بار باید تکرار شود (مثلاً ۵۰ پاس تراشکاری).
قالب کلی:
For [متغیر شمارنده] = [مقدار شروع] To [مقدار پایان] Step [گام حرکت]
' کدهایی که باید تکرار شوند
Next [متغیر شمارنده]
متغیر شمارنده: یک متغیر از نوع Integer است که تعداد دفعات چرخش حلقه را میشمارد.
Step: مشخص میکند که شمارنده در هر چرخش چقدر اضافه یا کم شود. اگر نوشته نشود، نرمافزار به صورت پیشفرض یکی یکی بالا میرود.
۵-۲. کار با سلولهای اکسل (Cells)
تا الان ما خروجیها را روی فرم (داخل Label یا MsgBox) نشان میدادیم. اما در کارهای مهندسی، ما نیاز داریم جداول بزرگی از دادهها بسازیم. اینجاست که قدرت اکسل نمایان میشود.
ما میتوانیم از طریق کدهای VBA، مستقیماً داخل سلولهای اکسل بنویسیم یا از آنها بخوانیم:
دستور:Sheet1.Cells(Row, Column).Value
Row: شماره سطر (۱، ۲، ۳…)
Column: شماره ستون (۱ برای A، ۲ برای B، ۳ برای C…)
مثال:Sheet1.Cells(1, 2).Value = 50 (عدد ۵۰ را در سطر اول و ستون دوم، یعنی سلول B1 بنویس).
⚙️ پروژه عملی ۳: تولید مختصات پاسهای کفتراشی (Face Milling)
شرح مسئله:
ما یک بلوک فولادی داریم و میخواهیم با دستگاه فرز CNC سطح آن را کفتراشی کنیم تا ضخامت آن کاهش یابد. ابزار ما روی سطح قطعه (Z=0) مماس شده است. میخواهیم در مجموع \(10 \text{ mm}\) از قطعه باربرداری کنیم و عمق مجاز باربرداری در هر پاس (Depth of Cut یا \(a_p\)) برابر با \(2 \text{ mm}\) است.
برنامهای بنویسید که مختصات محور Z را برای تمام پاسهای ماشینکاری تولید کرده و در یک جدول اکسل چاپ کند تا به عنوان Setup Sheet به اپراتور داده شود.
الگوریتم:
از Z = 0 شروع کن.
در هر مرحله، ۲ میلیمتر به سمت منفی حرکت کن (Step -2).
این کار را تا زمانی که به Z = -10 برسی تکرار کن.
در هر مرحله، شماره پاس و مختصات Z را در سطرهای اکسل چاپ کن.
مراحل ساخت رابط کاربری:
روی یک UserForm جدید، یک دکمه با نام btnGeneratePath قرار دهید و نام آن را “تولید مسیر ابزار” بگذارید.
کدنویسی:
Private Sub btnGeneratePath_Click()
Dim Z As Integer
Dim RowNum As Integer
Dim PassNumber As Integer
' ایجاد سرستونها در شیت اکسل
Sheet1.Cells(1, 1).Value = "شماره پاس"
Sheet1.Cells(1, 2).Value = "مختصات Z (عمق)"
' سطر اول را برای سرستونها اشغال کردیم، پس چاپ دادهها از سطر 2 شروع میشود
RowNum = 2
PassNumber = 1 ' شماره پاس از 1 شروع میشود
' شروع حلقه تکرار: از 0 تا منفی 10 با گام منفی 2
For Z = 0 To -10 Step -2
' چاپ شماره پاس در ستون اول (A)
Sheet1.Cells(RowNum, 1).Value = "Pass " & PassNumber
' چاپ مختصات عمق در ستون دوم (B) همراه با واحد
Sheet1.Cells(RowNum, 2).Value = "Z" & Z & " mm"
' آمادهسازی متغیرها برای چرخش بعدی حلقه
RowNum = RowNum + 1 ' یک سطر در اکسل پایین میآییم
PassNumber = PassNumber + 1 ' شماره پاس را یکی اضافه میکنیم
Next Z
MsgBox "مسیر ابزار با موفقیت تولید و در اکسل ثبت شد.", vbInformation
End Sub
کالبدشکافی کد:
چرا متغیر RowNum لازم است؟ حلقه For مقادیر 0، 2-، 4- و… را تولید میکند. ما نمیتوانیم این اعداد منفی را به عنوان شماره سطر اکسل استفاده کنیم (اکسل سطر منفی 2 ندارد!). بنابراین یک متغیر کمکی به نام RowNum ساختیم که از عدد 2 شروع میشود و مستقل از Z، در هر چرخش یک واحد به آن اضافه میشود تا سطرها به ترتیب (۲، ۳، ۴، ۵ و…) پر شوند.
حلقه چگونه متوقف میشود؟ به محض اینکه مقدار Z به عدد 10- برسد، کدهای داخل حلقه یک بار دیگر اجرا میشوند و سپس نرمافزار به صورت خودکار از حلقه خارج شده و به خط بعد از Next Z (یعنی پیام MsgBox) میرود.
یکی از بدترین خطاهایی که در برنامهنویسی رخ میدهد، حلقه بینهایت است. اگر شما شرط پایان حلقه را اشتباه بنویسید (مثلاً بنویسید For Z = 0 To 10 Step -2) کامپیوتر چون با گام منفی هرگز به عدد مثبت 10 نمیرسد، تا ابد به شمردن ادامه میدهد و نرمافزار اکسل هنگ میکند! در این حالت برای متوقف کردن اجباری برنامه باید کلیدهای Ctrl + Break را روی کیبورد فشار دهید.
۵-۳. حلقههای تو در تو (Nested Loops)
گاهی نیاز داریم یک حلقه داخل حلقه دیگر قرار بگیرد. مثلاً فرض کنید میخواهیم روی یک صفحه مستطیلی، ۳ ردیف سوراخ بزنیم که در هر ردیف ۵ سوراخ قرار دارد (مجموعاً ۱۵ سوراخ).
در این حالت از دو حلقه استفاده میکنیم: حلقه بیرونی برای حرکت در محور Y (ردیفها) و حلقه درونی برای حرکت در محور X (ستونها). این مفهوم پایه و اساس تولید الگوهای سوراخکاری (Hole Patterns) در ماشینکاری CNC است که در فصلهای آینده به آن خواهیم پرداخت.
تمرینات پایان فصل پنجم:
در پروژه عملی ۳، کدی را به برنامه اضافه کنید که قبل از تولید مسیر جدید، اطلاعات قبلی روی شیت اکسل را پاک کند. (راهنمایی: میتوانید از دستور Sheet1.Range("A2:B100").ClearContents در ابتدای برنامه استفاده کنید).
برنامهای بنویسید که با استفاده از حلقه For، جدول ضرب ۱ تا ۱۰ را در ستون A و B اکسل چاپ کند (مثال: در ستون اول بنویسد “1 * 5 =” و در ستون دوم جواب آن یعنی 5 را بنویسد).
📚 فصل ششم: توابع ریاضی و تولید G-Code (پروژه نهایی)
در دنیای ماشینکاری و برنامهنویسی CNC، هندسه و ریاضیات حرف اول را میزنند. محاسبه مختصات دقیق برخورد ابزار با قطعه کار، نیازمند استفاده از توابع مثلثاتی (سینوس و کسینوس) و جبر است. زبان VBA توابع ریاضی قدرتمندی را در اختیار ما قرار میدهد که در این فصل با آنها آشنا میشویم.
۶-۱. توابع پایه ریاضی در VBA
پرکاربردترین توابعی که در رشته ماشینافزار به آنها نیاز دارید عبارتند از:
قدر مطلق (Abs): علامت منفی را از بین میبرد. در محاسبه فاصله بین دو نقطه کاربرد دارد.
مثال: Abs(-15.5) خروجی \(15.5\) میدهد.
جذر یا ریشه دوم (Sqr): برای محاسبه وتر مثلث یا استفاده در قضیه فیثاغورس (\[C = \sqrt{A^2 + B^2}\]) استفاده میشود.
مثال: Sqr(25) خروجی \(5\) میدهد.
۶-۲. توابع مثلثاتی و «تله رادیان»
توابع Sin (سینوس)، Cos (کسینوس) و Tan (تانژانت) در VBA به صورت پیشفرض وجود دارند. اما یک نکته بسیار مهم و حیاتی مهندسی در اینجا وجود دارد:
⚠️ نکته طلایی (تله رادیان): تمام زبانهای برنامهنویسی (از جمله VBA)، زاویه را بر حسب رادیان (Radian) دریافت میکنند، نه درجه (Degree)! اگر شما بنویسید Sin(30)، کامپیوتر سینوس ۳۰ رادیان را حساب میکند نه ۳۰ درجه!
راهحل: ما باید همیشه زاویه را قبل از دادن به تابع، از درجه به رادیان تبدیل کنیم. فرمول تبدیل بسیار ساده است:
برای استفاده از عدد پی (\(\pi\)) در VBA، بهترین راه استفاده از تابع داخلی اکسل است: Pi = WorksheetFunction.Pi()
۶-۳. چسباندن رشتهها (String Concatenation)
در دستگاههای CNC، فرمت کدها ترکیبی از حروف و اعداد است (مثل X25.5 Y-10.0). برای اینکه بتوانیم در VBA یک حرف ثابت (مثل “X”) را به یک متغیر عددی بچسبانیم، از علامت & (آمپرسند) استفاده میکنیم.
مثال: اگر متغیر X_Pos برابر با \(12.5\) باشد، عبارت "X" & X_Pos خروجی متن X12.5 را تولید میکند.
⚙️ پروژه نهایی (Master Project): تولید G-Code سوراخکاری روی دایره (BHC)
شرح مسئله:
یکی از رایجترین و زمانبرترین کارها در کارگاه، سوراخکاری روی یک مسیر دایرهای (Bolt Hole Circle) است (مثلاً سوراخهای روی فلنج). اپراتور باید مختصات \(X\) و \(Y\) مرکز هر سوراخ را با سینوس و کسینوس حساب کند.
ما میخواهیم نرمافزاری بسازیم که شعاع دایره (\(R\))، تعداد سوراخها (\(N\)) و زاویه شروع (\(\theta\)) را از کاربر بگیرد و با زدن یک دکمه، تمام G-Code های لازم برای سیکل سوراخکاری (\(G81\)) را در اکسل چاپ کند!
تحلیل ریاضی مسئله:
زاویه بین هر سوراخ برابر است با: \[\Delta\theta = \frac{360}{N}\]
مختصات هر سوراخ از روابط زیر به دست میآید:\[X = R \times \cos(\text{Angle})\]\[Y = R \times \sin(\text{Angle})\]
مراحل ساخت رابط کاربری (UI):
یک UserForm جدید باز کنید.
سه عدد TextBox برای دریافت اطلاعات قرار دهید و نام آنها را txtRadius (شعاع)، txtHoles (تعداد سوراخ) و txtStartAngle (زاویه شروع) بگذارید.
یک CommandButton با نام btnGenerateGCode (تولید برنامه CNC) قرار دهید.
کدنویسی پروژه نهایی:
روی دکمه دوبار کلیک کنید و کدهای زیر را با دقت وارد کنید:
Private Sub btnGenerateGCode_Click()
' 1. تعریف متغیرها
Dim R As Double, StartAngle As Double
Dim NumHoles As Integer
Dim AngleStep As Double, CurrentAngle As Double
Dim X As Double, Y As Double
Dim Radian As Double
Dim Pi As Double
Dim i As Integer
Dim RowNum As Integer
' پاک کردن شیت اکسل برای برنامه جدید
Sheet1.Cells.ClearContents
' 2. دریافت اطلاعات از فرم
R = Val(txtRadius.Text)
NumHoles = Val(txtHoles.Text)
StartAngle = Val(txtStartAngle.Text)
' 3. محاسبات اولیه
Pi = WorksheetFunction.Pi() ' دریافت عدد پی از اکسل
AngleStep = 360 / NumHoles ' زاویه بین هر سوراخ
CurrentAngle = StartAngle ' تنظیم اولین زاویه روی زاویه شروع
' چاپ سرستونهای G-Code در اکسل
Sheet1.Cells(1, 1).Value = "شماره بلوک"
Sheet1.Cells(1, 2).Value = "G-Code"
RowNum = 2
' 4. حلقه تولید مختصات برای هر سوراخ
For i = 1 To NumHoles
' تبدیل زاویه فعلی از درجه به رادیان
Radian = CurrentAngle * (Pi / 180)
' محاسبه مختصات X و Y
X = R * Cos(Radian)
Y = R * Sin(Radian)
' گرد کردن اعداد تا 3 رقم اعشار (استاندارد دستگاه CNC)
X = Round(X, 3)
Y = Round(Y, 3)
' 5. چاپ کدهای CNC در شیت اکسل
Sheet1.Cells(RowNum, 1).Value = "N" & (i * 10)
If i = 1 Then
' برای سوراخ اول، سیکل G81 را روشن میکنیم (با عمق فرض Z-5 و سطح R2)
Sheet1.Cells(RowNum, 2).Value = "G90 G81 X" & X & " Y" & Y & " Z-5.0 R2.0 F100"
Else
' برای سوراخهای بعدی فقط مختصات جدید را میدهیم
Sheet1.Cells(RowNum, 2).Value = "X" & X & " Y" & Y
End If
' 6. آمادهسازی برای سوراخ بعدی
CurrentAngle = CurrentAngle + AngleStep ' زاویه را به اندازه گام بعدی میچرخانیم
RowNum = RowNum + 1 ' یک سطر در اکسل پایین میرویم
Next i
' لغو سیکل سوراخکاری در پایان
Sheet1.Cells(RowNum, 1).Value = "N" & ((i) * 10)
Sheet1.Cells(RowNum, 2).Value = "G80"
MsgBox "کدهای CNC با موفقیت تولید شدند!", vbInformation, "پایان عملیات"
End Sub
کالبدشکافی کد (نکات طلایی):
Round(X, 3): دستگاههای فرز CNC معمولاً تا ۳ رقم اعشار (میکرون) را میخوانند. اگر عدد را گرد نکنیم، کامپیوتر ممکن است عددی مثل 12.54329871 را تولید کند که باعث خطای Syntax در کنترلر CNC میشود. تابع Round این مشکل را حل میکند.
تولید شماره بلوک (N-Codes): در استاندارد برنامهنویسی CNC، خطوط برنامه با N مشخص میشوند و معمولاً ۱۰ تا ۱۰ تا بالا میروند (N10, N20, N30). ما با فرمول "N" & (i * 10) این شمارهها را به صورت خودکار و بسیار هوشمندانه تولید کردیم!
منطق G81: در خط اولِ سوراخکاری، ما کل فرمان G81 (سیکل سوراخکاری) را نوشتیم. طبق استاندارد CNC (Modal Codes)، تا زمانی که دستور G80 صادر نشود، سیکل فعال میماند؛ بنابراین در سوراخهای دوم به بعد (بخش Else) فقط کافیست مختصات \(X\) و \(Y\) جدید را به کنترلر بدهیم و در خط آخر G80 را چاپ کردیم.
تمرینات پایان ترم:
در پروژه بالا، اگر کاربر به جای نقطه (مبدا مختصات در \(X=0, Y=0\)) بخواهد دایره سوراخها را در نقطه \(X=50, Y=50\) ایجاد کند، کد را چگونه تغییر میدهید؟ (راهنمایی: دو TextBox جدید برای آفست مرکز دایره اضافه کنید و مقادیر آنها را با خروجی سینوس و کسینوس جمع کنید).
برنامهای بنویسید که قطر میلگرد (\(D\)) و سرعت برشی (\(V_c\)) را از هندبوک ماشینکاری بگیرد و دور اسپیندل (RPM) ماشین تراش را با فرمول \[N = \frac{1000 \times V_c}{\pi \times D}\] محاسبه کند.