بسم الله الرحمن الرحيم

ما هو التحكم العددي وماهي طريقة برمجته ؟

هذا الموضوع احببت ان اطرحه كسؤال حتى لا تكون الاجابة مقتصرة على التعريف به فقط لكن المرجو هو الوصول الى المعلومات البرمجية الشاملة والخوارزميات والدوال البرمجية حيث ان بعض هذه الدوال تعتبر ذات قيمة علمية وتستخدم في مجالات متعددة مثال ذلك التحكم بتصحيح القيمة المرتجعة (Feedback) وخوارزمية (PID) لتخميد الخطأ وتعويض الكسب ومولدات احداثيات الانتقال من نقطة الى نقطة في فراغ ثلاثي الابعاد ومولدات رسم الخطوط والدوائر او مايسمى بـ (Geometry Function)
طبعا جميع الاشياء تتكون من (اعداد ) و هذا محور ما اكتب عنه الان (التحكم العددي).


اما القسم البرمجي والرياضي سوف نبدأ فيه عن طريقة كيفية رسم خط في الفراغ ثلاثي الابعاد لاني وجدت من يسأل عن هذا الموضوع ولكن السائل كان على ما اذكر يريد كيف يحول القيمه المدخلة الى مخرجين :
1- نبضه
2-اتجاه
لثلاث محاور فهو بذلك قفز اكثر من مرحلة .
عموما ساتجنب الجزء الرياضي واورد الجزء البرمجي للاختصارثم فل يبدأ المعرفون والمدونون بطرح مايجدونه مناسب .
وهو دالة بلغة السي لتوليد احداثيات الخط المستقيم في الفراغ تستخدم مكتبة الدوال الرياضية (math.h) .

هذه الدالة مستخدمة في (cnc controller) وفي مجالات اخرى .

void line_3D(int x1, int y1, int z1, int x2, int y2, int z2)
{
int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2;

dx = x2 - x1;
dy = y2 - y1;
dz = z2 - z1;

x_inc = (dx < 0) ? -1 : 1;
l = abs(dx);

y_inc = (dy < 0) ? -1 : 1;
m = abs(dy);

z_inc = (dz < 0) ? -1 : 1;
n = abs(dz);

dx2 = l << 1;
dy2 = m << 1;
dz2 = n << 1;

if ((l >= m) && (l >= n)) {
err_1 = dy2 - l;
err_2 = dz2 - l;
for (i = 0; i < l; i++) {
Output_Fun (x1,y1,z1); // Output
if (err_1 > 0) {
y1 += y_inc;
err_1 -= dx2;
}
if (err_2 > 0) {
z1 += z_inc;
err_2 -= dx2;
}
err_1 += dy2;
err_2 += dz2;
x1 += x_inc;
}
} else if ((m >= l) && (m >= n)) {
err_1 = dx2 - m;
err_2 = dz2 - m;
for (i = 0; i < m; i++) {
Output_Fun(x1,y1,z1);
if (err_1 > 0) {
x1 += x_inc;
err_1 -= dy2;
}
if (err_2 > 0) {
z1 += z_inc;
err_2 -= dy2;
}
err_1 += dx2;
err_2 += dz2;
y1 += y_inc;
}
} else {
err_1 = dy2 - n;
err_2 = dx2 - n;
for (i = 0; i < n; i++) {
Output_Fun (x1,y1,z1);
if (err_1 > 0) {
y1 += y_inc;
err_1 -= dz2;
}
if (err_2 > 0) {
x1 += x_inc;
err_2 -= dz2;
}
err_1 += dy2;
err_2 += dx2;
z1 += z_inc;
}
}
Output_Fun (x1,y1,z1);
end of function //////
{
ان مدخل الدالة يتكون من نقطة البداية او النقطة الحالية (x1,y1,z1) والنقطة المراد الوصول لها او النقطة المطلوبة (x2,y2,z2) .

اما خرج الدالة ()
line_3D فيكون متغيرات قيم مطلقة تأخذ من مكان وجود الدالة Output_Fun(x1,y1,z1)s .

للموضوع بقية والله الموفق .