دیباچه
کنترل کلمه ای است که بشر از ابتدای خلقت به دنبال شیوه های گوناگون آن بوده است. بشر نخستین(ناندرتال) با آزمون روش های مختلف به دنبال رام کردن طبیعت و بارور کردن زمین بود. با تشکیل جوامع بشری از کوچکترین شکل خود(خانواده)انسان به دنبال تحت اختیار گرفتن جنبه های مختلف زندگی بوده است. به دنبال گسترش زندگی اجتماعی و بوجود آمدن مبانی حکومتی، افراد مختلف به سبب قدرت، مکنت، اصالت خانوادگی و... در پی کسب برتری نسبت به سایرین که منجربه در دست داشتن اختیار خود و دیگران بوده، تلاش میکردند. به دنبال این خصیصه که حس جاه طلبی انسان را تحریک می کرد برای بدست آوردن قدرت و کنترل بیشتر میان جوامع مختلف جنگهای خونینی رخ داده است که حتی در صده های اخیر نیز شاهد آن بوده ایم.
با شکل گرفتن فناوری و خارج شدن بشر از ورطه جهالت تلاش برای بدست گرفتن کنترل، انسان را به یافتن شیوه های جد ید برای ارضای آز خویش وا داشت. با اختراع اسلحه دیگر دوران شمشیر و کمان به سر آمد. با به میدان آمدن توپ و تانک دیگر جایی برای اسب و منجنیق نبود.
اما در دنیای فناوری هیچ چیز متوقف نمی شود. با کشف کامپیوتر و هوش مصنوعی زندگی بشر به کلی دگرگون شد. با این اکتشافات از ارزش جنگ افزار روزبه روز کاسته می شد و بر اهمیت تبلیغ و علوم وابسته به هوش مصنوعی افزوده می شد. اندک اندک کنترل جنبه فیزیکی خود را به جنبه فکری بدل می کرد و تشنگان قدرت به دنبال راههای کنترل افکار افتادند و نه کنترل اجسام.
اما اگر به سطح خرد جامعه بنگریم در می یابیم که هر انسانی چه برای ارضای حس جاه طلبی و چه برای رفاه و آسایش خود به دنبال روشهایی برای کنترل و تحت اختیار داشتن شئونات زندگی خود است. این کنترل شامل اعضای خانواده، اسباب زندگی، لوازم کـــار و... می شود.
با نگاه به زندگی بشری از زمان شکل گیری بنیان زندگی خانوادگی مشاهده می کنیم که اولین مظهر پیشرفت بشریت در خانه انسان نمایان می شود و همواره این پیشرفت برای توسعه رفاه انسان بوده است.
از زمان اختراع چرخ تا اولین کامپیوتر و لامپ خلا ء اسباب زندگی به شکل شگرفی دچار دگرگونی شده اند. اما تغییرات عمده در نیم قرن اخیر رخ داده است که کامپیوتر وارد زندگی شخصی هر فرد شده و هر که بیشر و بهتر از مزا یای آن مطلع شد و بهره برد، رفاه بیشتری خواهد داشت.
امروزه کار بدانجا رسیده است که انسان حاضر نیست حتی برای خاموش کردن یک چراغ از جای خود حرکت نماید و حال که فن آوری اینچنین اجازه ای به او میدهد او نیز حریصانه طالب آن است. امروز حتی می توان از فواصلی بعید به کنترل آنچه مربوط به ماست بپردازیم، کاری که بشر نخستین در رویا میدید.
در این پایان نامه برحسب موضوع به ارائه شمایی از یک سیستم کنترل وسایل(اسباب منزل,خطوط تولیدات صنعتی,...) از طریق فناوری اینترنت به عنوان یک شبکه ارتباطی و از راه دور می پردازیم. در این راستا سعی شده است تا از سخت افزار و نرم افزار مناسب استفاده شود، اما ذیق وقت و در بعضی موارد کمبود امکانات دایره مقدورات را تنگ نمود و حاصل آن،این پایان نامه است که تقدیم میگردد.
فصل اول _ پیش درآمد
- اتوماسیون صنعتی
درابتدا بهتر است کمی با مفهوم اتوماسیون یا به معنای ساده تر کنترل دستگاههای صنعتی با استفاده از کامپیوتر آشنا شویم.
1-1- لزوم استفاده از اتوماسیون صنعتی
با توجه به پیشرفت بسیار سریع تكنولوژی و وجود رقابتهای شدید در بین صنعتگران دو مقوله دقت و زمان در انجام كارهای تولیدی و خدماتی بسیار مهم و سرنوشتساز شده است. دیگر سیستمهای قدیمی جوابگوی نیازهای صنعت توسعه یافته امروز نبوده و به كار بردن سیستمهایی كه با دخالت مستقیم نیروی انسانی عمل میكنند، امری نامعقول مینمود. چرا كه در این موارد دقت و سرعت عمل سیستم بسیار پایین و وابسته به نیروی كاربر است.
بنابراین ماشینهای هوشمند و نیمههوشمند وارد بازار صنعت شدند و بعد از مدتی آن چنان جای خود را پیدا كردند كه علاوه بر زمینههای صنعتی در كارهای خدماتی نیز جایگاه ویژهای یافتند. كنترل سیستمهای بسیار پیچیدهای كه قبلا غیرممكن بود به راحتی انجام میگرفت. مكانیزه كردن سیستمها و ماشینآلات (اتوماسیون صنعتی) مقوله بسیار مهم و پرطرفداری شده و نیاز به آن هر روز بیشتر و بیشتر مشهود میشود.
اتوماسیون صنعتی در زمینههای بسیار گستردهای كاربرد دارد. از مكانیزه كردن یك ماشین بسیار ساده كنترل سطح گرفته تا مكانیزه نمودن چندین خط تولیدی و شبكه كردن آنها. با نگاهی به محیط اطرافمان میتوانیم نمونههای بسیار زیادی از كاربرد اتوماسیون را در اغلب زمینهها پیدا كنیم. اتوماسیون در واحدهای مسكونی جدید، در شــبكههـای مـخـابـراتی، در سیـستـمهای دفــــع فاضـلاب، سـیسـتم توزیع برق، كارخانجات مختلف و ... .
در یك سیستم اتوماسیون شده كنترل پروسه توسط ماشین انجام میشود و در این سیستمها دخالت انسان به حداقل و در برخی موارد به صفر رسیده است. سیستم با گرفتن سیگنالهای ورودی از قطعاتی نظیر سنسورهای تشخیص فشار، رنگ، سطح مایعات، قطعات فلزی، سنسورهای دما، میكروسوئیچها، كلیدها و شستیها، واسطهای كاربر با ماشین و نظایر آنها وضعیت موجود را حس كرده و بررسی میكند و سپس در مورد عكسالعمل ماشین تصمیمگیری كرده و فرمانهای لازمه را به قطعات خروجی كه تحت كنترل ماشین هستند، اعمال میكند. با توجه به مواردی كه ذكر شد میتوان ساختار یك سیستم اتوماسیون را بدین صورت لیست نمود:
- قطعات ورودی شامل سنسورها، سوئیچها و ...؛
- قطعات خروجی مثل موتور، پمپ، شیر برقی، نشانگرها؛
- یك كنترل داخلی با CPU برای پردازش دادهها و اجرای برنامه كنترلی سیستم و حافظه برای ذخیره نمودن برنامه كنترلی و اطلاعات دریافتی از قطعات ورودی؛
- یك واسط بین كاربر و ماشین در مواردی كه نیاز به انجام تنظیمات توسط كاربر داریم و یا میخواهیم یك سری اطلاعات و آلارمها را به اطلاع كاربر برسانیم.
توجه داشته باشید با بالا بردن سرعت و دقت كنترلر مورد استفاده در سیستم اتوماسیون شده و انتخاب درست آن بر طبق كاربردی كه از آن انتظار داریم میتوانیم امكانات و قابلیتهای سیستم را بالاتر ببریم. به عنوان مثال در یك سیستم ساده كنترل سطح مخزن سرعت پاسخگویی سیستم در حد چند ثانیه هم برای این كار كافی خواهد بود. اما در سیستمهای پیچیده موقعیتیاب یا پردازش تصویر به سیستمهای بسیار معتبر و دقیقتر احتیاج داریم و سرعت پاسخگویی در حد میكروثانیه برای ما لازم است.
به عنوان مثال در مواردی كه نیاز به كنترل در یك محیط نامساعد داریم و استفاده از نیروی انسانی بسیار مشكل و یا غیرممكن است، چه كار باید كرد. در محیطهایی با شرایط آب و هوایی بسیار بد و با مناطق جغرافایی صعبالعبور و یا در محیطهایی كه آلودگی صوتی و یا آلودگیهای شدید تنفسی دارند، در این موارد ایمنتر و با صرفهترین گزینه اتوماسیون كردن سیستمها و استفاده از ماشین به جای انسان است.
اجرای كامل سیكل كنترلی، گرفتن گزارشات لازم در حین انجام عملیات كنترلی، قابلیت تغییر سیكل كاری و تعریف نمودن پارامترهای كنترلی، امكان انجام كنترل دستی در موارد اضطراری و ... حال به مثال دیگری میپردازیم. حساب كنید در یك سیستم بسیار ساده بستهبندی محصولات غذایی برای بستهبندی هزار كیلو شكر در بستههای یك كیلویی به چند نفر و چه قدر زمان احتیاج داریم. چند نفر برای وزن كردن محصول، چند نفر برای آمادهسازی پاكتها، چند نفر برای پر كردن پاكتها و بستهبندی آن، زدن تاریخ مصرف و ... . در این گونه سیستمها مشكلات زیادی وجود دارد كه به برخی از آنها در زیر اشاره شده است:
- زیاد بودن تعداد نفراتی كه در این قسمت كار میكنند؛
- نیاز به محیط كاری بزرگتر تا بتوان از شلوغی ناشی از تعدد نیروی انسانی كاست؛
- خستگی و دقت پایین افراد؛
- صرف زمان زیاد؛
- هزینه بسیار بالا؛
- بازدهی بسیار اندك؛
- كیفیت بسیار پایین محصولات؛
از این مثالها در صنعت بسیار زیاد بوده است. به هر حال نتیجهای كه از آنها میگیریم این است كه نیاز به اتوماسیون یك نیاز غیرقابل اجتناب بوده و استفاده از آن روز به روز بیشتر خواهد شد. در نتیجه استفاده از این نوع سیستمها لحظه به لحظه بر كیفیت محصولات و خدمات افزوده و صنایعی را كه از این سیستمها استفاده میكنند، بیرقیب و قدرتمند میسازد.
2-1- تاریخچه سیستمهای كنترل
سیر تحولات سیستمهای كنترل را میتوان به چهار مرحله زیر تقسیم نمود:
1- سیستمهای كنترل پنوماتیكی
2- سیستمهای كنترل الكترونیكی
3- سیستمهای كنترل مستقیم دیجیتال
4- سیستمهای كنترل غیرمتمركز (DCS)
1-2-1- سیستمهای پنوماتیك
پیش از استفاده از سیگنالهای الكتریكی برای كنترل دستگاهها در صنعت، از ابزارهای نیوماتیك استفاده میشد. به این ترتیب كه به هر ابزار فیلد تغذیه هوا با فشار استاندارد psi100 متصل میشد و سیگنالهای ورودی سیستم كنترل و نیز فرمانهای كنترلر به صورت تغییرات فشار در خطوط هوای بین وسیله و كنترلر منتقل میشد.
موارد مورد نیاز در سیستمهای نیوماتیك برای برقراری ارتباط شامل كمپرسورها، خطوط هوا، رگولاتورها، خشككنها و ... میباشد. سیگنال فرستاده شده از وسیله در كنترلر به كمك كنترلرهای تناسبی، PID، PI فرمان لازم برای عملگر را تولید میكند.
در این راستا، در دهه 1950 اولین كنترلرهای پنوماتیكی به بازار عرضه شدند. بسیاری از پالایشگاهها و صنایع شیمیایی و پتروشیمی هنوز از این نوع سیستمها استفاده میكنند. سیستمهای پنوماتیكی از نظر ایمنی برای محیطهای آتشگیر مناسبند و در ضمن بسیار بادوامند، اما به علت پایین بودن سرعت پاسخ، این تجهیزات برای كنترلهای پیشرفته مناسب نمیباشند. در ضمن تابلوهای كنترل از این نوع حجم زیادی را اشغال میكنند.
2-2-1- سیستمهای الكترونیك
در سال 1947 شركت Bell توانست مدار مجتمع را اختراع نماید و در دهه 1960 از آن در ساخت تجهیزات كنترلی از نوع الكترونیك استفاده شد. حجمی كه این تجهیزات اشغال میكنند كمتر از نوع پنوماتیك است و لذا پنلهای كنترل الكترونیك كم حجمترند ولی در عوض محافظت این سیستمها مشكلتر است. جلوگیری از اتصال كوتاه شدن و جرقه زدن در این تجهیزات بسیار مهم است. یكی دیگر از مشكلات مسأله آلوده شدن سیگنالها به نویز میباشد كه با تمهیدات لازم باید از آن جلوگیری نمود.
3-2-1- سیستمهای كنترل دیجیتال
در اوایل دهه 1970 استفاده از كامپیوتر برای كنترل فرآیند تجربه گردید. در این نوع سیستم كنترل، یك كامپیوتر كل فرآیند را كنترل مینماید. در صورت خرابی كامپیوتر میتوان از یك كامپیوتر دیگر كه به صورت Standby كار میكند، استفاده نمود.
4-2-1- سیستمهای كنترل غیرمتمركز
با معرفی میكروپروسسورها و میكروكامپیوترها به بازار كارهایی كه در یك پروسه بر عهده یك كامپیوتر بود، بین میكروپروسسورها و میكروكامپیوترها تقسیم شد و باعث به وجود آمدن نسلی از روش كنترل به نام DCS شد.
DCS مخفف Distributed Controller System است، هدف از آن انجام عملیات كنترلی به صورت غیرمتمركز است. بر خلاف ظاهر سیستم DCS كه كلیه كنترلرها به اتاق كنترل آورده شدهاند و به نظر میرسد كه كنترل به صورت متمركز انجام میشود. این در حالی است كه در سیستمهای نیوماتیك كنترلرها اكثرا به صورت محلی وجود دارد كه در سایت نصب شدهاند: در DCS دیگر كنترلری در محل سایت نداریم؛ آن چه اساسا در سیستم DCS رخ میدهد، تقسیم عملیات كنترلی بین چندین كنترلكننده است كه در اتاق كنترل قرار گرفتهاند؛ به دلیل همین تقسیم است كه سیستم توزیعپذیر نامگذاری شده است.
در این سیستم حلقههای سادهای متشكل از فیلد و كنترلر وجود دارد كه این كنترلرها (میكروپروسسورها) در یك لایه بالاتر در سطح supervisor به هم متصل هستند.
برای DCS میتوان چهار سطح كاری در نظر گرفت:
1- فیلد
در این سطح ما با سنسورها و عملگرها سر و كار داریم.
2- مارشال كابینت
ترمینالهایی كه سیمكشی را مرتب میكنند. در این ترمینالها ایزولاتور، سدهای تغییردهنده سیگنال به طور دلخواه و ... موجود است.
3- ایستگاه فرآیند
شامل كابینتهایی است كه داخلشان كارت I/O و كنترلرها قرار دارد.
4- ایستگاه اپراتور
جایی كه اپراتور مینشیند كارخانه را نظارت مینماید.
در این جا گذرگاه I/O به صورت سریال است و كنترلرهای مختلف از طریق شاهراه دادهها به هم متصل هستند و گاهی از پروتكل RS485 یا RS232 استفاده میكنند. معمولا پروتكل شاهراه دادهها را توسط یك واسط تبدیل به پروتكل اترنت مینمایند. مثلا از انواع این واسطها میتوان به HDL اشاره كرد. ارتباط LAN از طریق كابل كواكسیال؛ زوج سیم یا فیبر نوری صورت میگیرد. در سیستم DCS، PID در كنترلرها انجام میشود. نكته بسیار مهم در مورد DCS قابلیت ذخیرهسازی اطلاعات است. در سیستمهای قدیمی چنان چه از اطلاعات به دست آمده استفاده نماییم، اطلاعات از بین میرود.
در حالی كه سیستم DCS قابلیت ذخیرهسازی اطلاعات دارد. مشكل عمده در سیستمهای DCS، وابسته به سازنده بودن این سیستم است. مثلا اگر كنترلر از یك شركت خریداری كنیم، قطعات یدكی را هم باید از همان شركت بخریم.
همچنین مسأله داشتن یك سیستم در حال خواب در صورت بروز خرابی در سیستم به صورت مطمئن در سیستمهای DCS حل شده است و در صورت از كار افتادن یك پردازنده، پردازنده دیگری به صورت اتوماتیك جایگزین آن میگردد. این نوع ایمنی میتواند در سطح كارتهای واسطه نیز اعمال گردد.
در سالهای اخیر سیستمهای DCS كوچكتری به بازار عرضه شده كه مناسب برای صنایع كوچك میباشد. تعداد حلقههای كنترل و نقاطی كه مانیتور میشوند در این نوع سیستمها به مراتب كمتر از سیستمهای DCS بزرگ میباشد و كل تجهیزات (كابینتها و مانیتورها) در اتاق كنترل قرار میگیرند.
امروزه در اكثر كشورهای جهان تابلوهای كنترل سنتی در حال تعویض با سیستم DCS میباشند و اكثر واحدهای جدیدالتأسیس از سیستم DCS جهت كنترل استفاده مینمایند.
1-4-2-1- مزایای سیستمهای DCS
بعضی از مزایای سیستمهای DCS نسبت به سیستمهای سنتی عبارتند از:
الف- سهولت مانیتورینگ و جمعآوری و تحلیل اطلاعات
ب- امكان اعمال روشهای پیشرفته كنترل
ج- امكان اعمال كنترل نظارتی
د- حجم فیزكی كمتر
و- تعداد اپراتور كمتر
عوامل فوق در مجموع باعث كاهش هزینه و بالا رفتن كیفیت تولید میگردد.
در كشور ما واحدهای جدید پتروشیمی و پالایشگاهی مجهز به سیستم DCS میباشند و بسیاری از واحدهای قدیمی در صدد تعویض سیستمهای موجود میباشند. چندین كارخانه جدید نیز DCSهای كوچك خریداری نمودهاند كه به زودی نصب و راهاندازی میشود.
با توضیحاتی که در بالا ارائه شد کنترل تجهیزات کارخانه های تولیدی امری ابتدایی و بسیار ضروری بنظر میرسد. مثلا در کارخانه چینی سازی برای تولید چینی نیاز است تا کوره های سرامیکی بسیار بزرگ و گران قیمتی را برای پخت تهیه کنند که باید قبل از شـروع به کار کاملا گرم شود. این کــار مدت زمان زیادی در حدود 2 ساعت به طــول می انجامد.از این رو باید پیش از حضور کارگران در محل کار کوره روشن باشد. یکی از راههایی که هم اکنون در اغلب این کارخانه ها صورت می پذیرد این است که کوره را در تمام طول شب روشن نگه میدارند که علاوه بر هزینه های بالایی که دارد مشکلاتی از جمله آلودگی محیط زیست را نیز به همراه می آورد.
اکنون تصور کنید که بتوان کوره ها را 2 ساعت پیش از حضور کارگران در محل کارشان روشن نمود و از هزینه های گزاف روشن نگه داشتن دائمی کوره ها رها شد ویا انتظار خط تولید را برای گرم شدن کوره ها به صفر رساند.
چنانچه بتوان از راه دور و از طریق کامپیوتر سیستمی مانند کوره های مذکور را کنترل نمود میتوان در صنعت مصارف گسترده ای را برای آن در نظر گرفت. بنابر این چنین سیستمی کاربردهای فراوانی دارد
-PHP در یک نگاه
برای آشنایی بهتر با این زبان برنامه نویسی به طرح چند سوال و پاسخ آنها می پردازیم:
از مهمترین شاخههای دانش كامپیوتر، طراحی ، تولید تصاویر،آفرینش صفحات وب و خلق انیمیشن میباشد. این تصاویر و متحرك سازیها برای آنكه قابلیت ارسال از طریق اینترنت را داشته باشند باید از ویژگیهای خاصی برخوردار باشند.برای رعایت این نكته طراحان ناچارند از جدید ترین و پیشرفته ترین نرم افزارهای طراحی استفاده نمایند.
كمتر كاربر اینترنت را میتوان یافت كه تاكنون با صفحاتی با پسوند PHP برخورد نكرده باشد و البته این پسوند نامی آشنا برای طراحان و برنامهنویسان وب است.
پی اچ پی (PHP) یكی از محبوبترین و رایجترین زبانهای برنامهنویسی برای ایجاد صفحات پویا در وب است و كمتر خواستهای در محیط وب وجود دارد كه در PHP قادر به انجام آن نباشیم. از ایجاد یك صفحه ساده برای پردازش اطلاعات فرمها، ارتباط با بانكهای اطلاعات، كار با سوكتهای TCP، پردازش فرمتهای PDFوZIP و حتی تصویر بخشی از توانایی این زبان است.
مرور تاریخچه PHP:
PHP در سال 1994 توسط راسموس لردرف Rasmus Lerdorf و برای استفاده شخصیاش ایجاد شد. او بعدها و در سال 1995 نسخه حرفهایتر از مفسر زبان PHP به نام Version 2 PHP/FI را عرضه كرد، و در سال 97 تعداد سایتهایی كه از PHP استفاده میكردند به بیش از 50000 رسید و امروزه نیز میلیونها سایت از آن استفاده میكنند.
سایتهای مشهوری چون Alltheweb وmamma از این زبان استفاده میكنند و حتی Yahoo نیز در حال شروع استفاده از این زبان برای توسعه وب سایتهای خود است.
PHPچیست؟
PHPكه در ابتدا در سال 994 توسط Rusmus Lerdorf ایجاد شد و مخفف واژگان Personal Home page به حساب می آیدباگسترش قابلیتها وموارداستفاده این زبان در معنای Hypertext preprocessor به كارگرفته شد. عبارت پیش پردازشگر (preprocessor) بدین معنی است كه PHP اطلاعات را قبل از تبدیل به زبان HTML پردازش می كند.
به چه دلیل از PHP استفاده می كنیم؟
آسانتر
ایجاد ارتباط متقابل با كاربر
ارتباط با فایل ها و پایگاه های داده
سریعتردربرنامه نویسی و ایجاد واجرا
سرعت بالای تفسیر و اجرای PHP
پی اچ پی یكی از سریعترین زبانها در نوع خود است. تفسیر و اجرای یك اسكریپ php به طور متوسط تا سه و چهار برابر یك اسكریپ ASP است. (البته باید در نظر داشته باشیم كه IIS با Cach اسكریپتهای ASP سرعت اجرای آنها را در دفعات بعد بالا میبرد)
همچنین در ASP استفاده زیادی از اشیا COM میشود كه باعث كاهش سرعت و مصرف منابع سیستم میشود در حالی كه در PHP بسیاری از امكانات و حتی برقراری ارتباط با یكی محبوبترین نرمافزار مدیریت بانكهای اطلاعاتی (mySql به صورت توكار نهاده شده است.
شركت Zend كه تهیه كننده فعلی موتور مفسر و پشتیبانی كننده آن است، محصولات دیگری را نیز در جهت بهینه كردن سرعت اجرای PHP ارائه كرده است این محصولات با افزایش سرعت تفسیر و همچنین ذخیره كردن نتیجه تفسیر (Cash) باعث افزایش چندین برابر اجرای آن میشوند.
ساختار مناسب و امكانات بالا در PHP
كمتری نیازی در برنامهنویسی تحت وب وجود دارد كه در PHP امكان رفع آن نباشد. پی اچ پی شامل كتابخانهای غنی از توابعی است كه امكان پردازش اطلاعات فرمها، كار با بانكهای اطلاعاتی، فایلهای متنی و باینری، فایلهای گرافیكی، PDF ، ZIP و پروتكلهای TCP ، FTP ، DNS ،SMTP و ... را برای برنامهنویس فراهم میكند، این را مقایسه كنید با ASP كه به طور مستقل امكان Upload File ،ارسال ایمیل یا كار با فایلهای باینری را ندارد.
همچنین PHP یكی از بهترین پشتیبانیها را از نرمافزارهای بانك اطلاعات دارد. mySql,Sql Server,mSql,dBase,Oracle,IBM DB2,PostgreSQL,InterBase و بسیاری از نرمافزارهای دیگر در پی اچ پی قابل استفاده هستند و البته امكان كار با ODBC و COM برا ی استفاده از بانكهای Ms Access و دیگرمحصولات نیز هست.
قدرت زبان پی اچ پی تنها در كتابخانه توابع آن نیست، پشتیبانی بسیار خوب از برنامهنویسی شیءگرا (OOP) و كار آسان و سریع با متغیرها از مزایای این زبان است.
PHP چگونه کار می کند؟
نوشتن یك برنامه PHP شبیه ایجاد یك صفحه HTML است، تنها با این تفاوت كه كدهای این زبان در داخل صفحات و دراسکرپتهای HTML درج میشود و البته طبیعی است كه یك فایلphpمیتواند تنها شامل كدهای PHP باشد.با توجه به این كه PHP یك زبان طرف سرویسدهنده است، و بنابراین برای اجرا، اسكریپتهای آن باید آنها را به كامپیوتر سرویسدهنده وب (مانند سیستم Windows 2000 و نرمافزار IIS) انتقال دهیم و حالا با تایپ نام فایل آن در گردشگر اینترنت میتوانیم آنرا اجراوخروجی احتمالی را مشاهده كنیم.
پس از درخواست برای اجرای یك اسكریپت PHP فایل حاوی کدهای PHP به برنامه مفسر PHP انتقال داده شـده(معمولا php.exe) و این برنامه بعد از تفسیـر واجـرای اسكریپت نتیجه رابه سمت کاربر می فرستد.
فصل دوم_شرح نرم افزار پروژه
2-1- نرم افزار پروژه
در این بخش به چگونگی عملکرد نرم افزار این پروژه خواهیم پرداخت.
مجموعه این نرم افزار از دو بخش اصلی تشکیل شده است.
- بخش ارتباط مودمی کامپیوترها
- بخش ارتباط با سخت افزار
2-2- ارتباط مودمی
از آنجاییکه هدف پروژه کنترل دستگاهها از طریق ارتباط مودمی کامپیوترها می باشد،این ارتباط را با طراحی سایتی جامع و کارا برقرار نمودیم.
در طراحی این سایت علاوه براجرای عملیات اصلی در راستای اهداف پروژه، سعی شده است که در قسمتهای مختلف آن توضیحاتی در باره بخشهای گوناگون نرم افزار ارائه شود که در نهایت به معرفی بهتر این سایت بیانجامد ویکی از اهداف اصلی نرم افزار که همان کارائی آسان است تحقق یابد.
2-3- معرفی سایت
شكل 2-1 – home page
صفحه این سایت از دو قسمت تشکیل شده است. در سمت چپ آن tabهای: Run ProjectوSoftware DetailوHardware Detailوdocument sourcesوLinksوFuture قرار داردو در سمت راست صفحه عملیات هر کدام از این tabها نمایش داده میشود.
2-4- Run Project :
شكل 2-2 – run project
در این صفحه مقدار دهی پورت پرینتر و نتیجتا کنترل ماشینهای سخت افزاری ممکن
می شود.این پروژه کنترل 5 device سخت افزاری را تامین می کند، بنابر این در این صفحه سایت از 5 عددcheckbox که هرکدام متناظر با یکی از دستگاههای سخت افزاری (صنعتی) می باشد استفاده کرده ایم.با انتخاب این checkboxها جهت روشن شدن با کلیک بر دکمه Action کنترل را انجام می دهیم و چنانچه از گزینه Reset استفاده کنیم،گزینه ها به حالت پیش فرض که انتخاب نشدن هیچ یک از گزینه ها است، باز می گردد. این عملیات که مقداردهی به پورت پرینتر و ارتباط کامپیوتر با مدار طراحی شده میباشد،در بخش های آتی بطور دقیق بیان خواهد شد.
2-5- Software Detail:
شكل 2-3 – Software Detail
این بخش به معرفی مجموعه نرم افزاری پروژه پرداخته و اطلاعات مختصری در مورد زبانهای برنامه نویسی استفاده شده در این مجموعه را در اختیار کاربر قرار می دهد.
از آنجا که php و HTML پویا بوده و در عین حال ساده و سبک برای برنامه نویسی
می باشد،برای اعمال اجرائی سایت وهمینطور ارتباط سایت و واسط سخت افزار از این زبان بهره بردیم. اما چون قابلیت مقداردهی به پورتها و ارتباط با سخت افزار را ندارد،از زبانC# کمک گرفته ایم.
قابلیت استفاده ساده و سریع این زبان برنامه نویسی پویا،مقداردهی به پورتها و ارتباط PC با سخت افزار را بطور مطلوب ممکن می سازد .
طراحی شمای ظاهری سایت با استفاده از FrontPage صورت گرفته است.
برای رسم مدار سخت افزاری و تست کردن آن از نرم افزارهای شبیه سازی pspice و maxplus بهره گرفتیم و برای بهبود سایت جهت استفاده کاربر از نرم افزارهای webstyler,visioو flash کمک گرفته شده است.
2-6- Hardware Detail:
شكل 2-4 – hard Detail
نمودارهای مدار سخت افزاری این مجموعه اعم از نمودار كامل و جزئیات بخش های مختلف آن در این بخش قابل مشاهده است.این بخش که به معرفی مدار طراحی شده
می پردازد،کاربر را در بکارگیری مطلوب سخت افزار یاری می نماید.
توضیحات کامل این مجموعه سخت افزاری در بخش سخت افزار به تفصیل آمده است.
2-7- Document Sources :
شكل 2-5 – Document Sources
مستندات این پروزه اعم از مستندات سخت افزاری و نرم افزاری در این بخش قابل مشاهده است
2-8- Links:
شكل 2-6 – Links
امروزه مهمترین راهنما و مرجع دریافت اطلاعات مورد نیاز و به روز شده،سایتهای اینترنتی مختلف می باشد. در این بخش آدرس تعدادی از سایتهایی را که مورد استفاده قرار داده ایم،آمده است.اما از آنجاییکه پروتکل ارتباطی بکاررفته در این مجموعه Interanet است نه Intrernet ،اطلاعات download شده سایتها در این بخش به آدرس سایتها Link شده است.
2-9- Future :
شكل 2-7 – Future
در این قسمت نمایی از اهداف نهایی پروژه یا به عبارتی دورنمای پروژه ارائه شده است. در واقع در بخش future به تعمیم این مجموعه پرداخته ایم.
در آینده تصمیمات دستوردهی به کامپیوتر مبداء و انتخاب سخت افزارها برای کنترل شدن، توسط کامپیوتر صورت می گیرد و نیازی به صرف نیروی انسانی برای آن نیست.همینطور بجای استفاده از خط تلفن که مشکلات خاص خود از قبیل ترافیک خط و خرابی را دارد،از شبکه wireless بهره می بریم.
برای گسترش این مجموعه از internet بجای interanet استفاده می کنیم که این ارتباط را می توان از طریق ADSL و یا سیستم wireless بر قرار نمود.
اما نکته ای که ارزش زیادی در آینده این پروژه دارد این است که علاوه بر دادن اطلاعات از PC به سخت افزار بتوان اطلاعاتی را از سخت افزارها( که میتوانند دستگاههای صنعتی،اداری و ... باشند) به PC منتقل نمود. این تبادل اطاعات به کاربر (که می تواند هوش مصنوعی باشد) کمک می کند تا از وضعیت هر دستگاه مطلع شده و کنترل صحیح و مطلوب بر قطعات سخت افزاری داشته باشد.
با شناخت مشکلات و محدودیتهای این پروژه می توانیم در گسترش و بهبود کارایی آن اقداماتی را انجام دهیم.
2-10- نحوه عملکرد برنامه در بخش"ارتباط مودمی"
هنگام اجرای پروژه،پس از انتخاب ماشینهای مورد نظر،دکمه Action را انتخاب می کنیم.در این هنگام برنامه php ، فایل change-data را فرا خوانی می کند.این فایل که به فایلهای data و onoff دسترسی دارد، اطلاعات انتخابی کاربر را در فایل data قرار داده و در انتها به فایلonoff مقدار 1 را می فرستد. فایل dataداده های وارد شده توسط کاربر را بطور رشته ای در خود ذخیره می کند. زمانی که فایلonoff دارای مقدار 1 است نشان دهنده این است که تغییری در داده های ورودی صوت گرفته و تعداد صفر این فایل نشان دهنده بدون تغییر بودن داده های ورودی می باشد.
کاراکتر های خانه های اول تا پنجم فایلdata متناظر با device ها بوده و کاراکترهای شــشم و هفتم مربوط به استفاده پایه enable آی سی های SN7475N سخت افزار می باشد.
2-11- ارتباط با سخت افزار
در بـخـش ارتباط سخـت افـزاری برنامه از زبان برنامه نویسی C# بهره جسته ایم. پیش از اجرای برنامه و استفاده از سایت پروژه ، فایلی با پسوند exe بنام windows application را اجرا می کنیم. با این کار فرمی بنام form1 که در C# طراحی کرده ایم را فعال می کنیم. در source برنامه این فرم را hidden کرده ایم تا عملیات بدون وقفه و مزاحمت در کامپیوتر متصل به سخت افزار صورت پذیرد.
اما برای دسترسی به امکانات مورد نیاز گزینه های مورد استفاده این فرم را که شامل بخشهای زیر می باشد درNotifyIconقرار داده ایم. با کلیک راست بر روی این جزء در سمت راست task bar این گزینه ها قابل مشاهده است:
-disable برای غیر فعال کردن آن
-enable برای فعال کردن آن
-aboutبرای بدست آوردن اطلاعات مختصر و کلی
-files path برای set كردن مسیر برنامه
زمانیکه form1 فعال می شود ،timer1 که در آن تعبیه شده است اعمال مربوط به خود را انجام می دهد. این تایمر هر 1 میلی ثانیه (بازه زمانی دلخواه) button3 که همان کلید اعمال می باشد را اجرا می کند. عملیات اصلی و کلیدی در همین قسمت صورت می گیرد.به این ترتیب که در صورت یك بودن مقدار داخل فایل onoff.txt محتویات فایل data.txt که بصورت رشته باینری ذخیره شده به دسیمال تبدیل می گردد و توسط component ahxwinterface.ocx ، این مقدار دسیمال به آدرس پورت پرینتر (888) ارسال می گردد و داده ها از طریق کابل به سخت افزار منتقل می شوند. لازم به ذکر است که این component در .net وجود نداشت وبرای مقدار دهی به پورت پرینتر این component را از اینترنت download کرده و به itemهای visualstudio.net افزودیم.
در این میان فرم دیگری بنام data change طراحی شده است . این فرم هنگام اجرای برنامه و کلیک بر روی دکمه Action فعال شده و برای مدت 2 ثانیه بر روی صفحه نمایش کامپیوتر متصل بهdevice ها ظاهر می گردد. این فرم نشان دهنده وضعیت دستگاههایی است که آنها را کنترل می نماییم.
فصل سوم_شرح عملکرد سخت افزار
3-1- سخت افزار پروژه در یک نگاه:
سخت افزار این مجموعه در واقع یک INTER FACE و یا رابط بین PC و دستگاههای کنترل شونده (که به عنوان مثال میتواند دستگاههای سنگین و پرقدرت سه فازویا یک کوره حرارتی باشد)می باشد.این سخت افزار دستورات صادره از PC را گرفته وبه مدار فرمان ویا سوئیچ دستگاههای مصرف کننده انتقال میدهد.
در این طرح از IC ها در طبقه اول مدار به عنوان دروازه ارتباط در مسیرعبور اطلاعات که در اینجا سیگنالهای دستوریا فرمان می باشند استفاده شده است. 7475 IC که یک لچ
می باشد دستورات صادره از PCرا دریافت کرده و به طبقه بعدی ارسال می کند ضمن آنکه دستورات دریافت شده را در خود نگه داشته و تا زمانی که پایه مربوط به تغییر دستور توسط کاربر فعال نشده باشد تغییرات اتفاقی وناخواسته در خروجی PC امکان گذر از مسیر سیستم و اثر گذاری روی اطلاعات را نخواهند داشت.
از انجا که سطح ولتاژ و جریان خروجی از IC بسیار پایین است امکانِ استفاده مستقیم از آن وجود ندارد. در مر حله بعدی اطلاعات دریافت شده از PC از طریق ICهای لچ برای اینکه بتواند به سطحی مناسب برای استفاده در طبقات بعدی برسد توسط ترانزیستورها تقویت میشود در این قسمت از ترانزیستور های نوع N به دلیل خاصیت معکوس کنندگی در خروجی و همچنین سهولت در کار برد استفاده شده است.
در این مر حله سیگنالها به اندازه ای که بتوان در طبقه بعدی از انها استفاده کرد تقویت شده اند اما باید توجه داشت که از آنها نمی توان بطور مستقیم در مصرف کننده ها استفاده نمود. در این سیستم از رله به عنوان سوییچ اصلی کنترل کننده دستگاههای مصرف کننده استفاده شده است و اطلاعات خروجی از ترانزیستورها وارد رله ها می شوند. در شکل 3-1و3-3 و 3-4 مسیر انتقال سیگنالهای فر مان از PC تا مصرف کننده مشاهده می شود.
شكل 3-1- چارت مسیر data
شکل 3-2 مسیر تغذیه IC ها، تغذیه و بایاسینگ ترانزیستورها و رله ها و همچنین مسیر برق قدرت جهت را ه اندازی مصرف کننده به نمایش در آمده است.
شكل 3-2- چارت تغذیه
همانطور که ملاحظه می کنید از یک ترانسفورماتور کاهنده جهت تامین ولتاژ تغذیه IC ها و بوبین رله ها و جریان بایاس ترانزیستورها استفاده شده است.برای آنکه بتوان یک ولتاژ بدون اعوجاج و در سطح قابل استفاده درIC ها داشته باشیم از یک رگولاتور ولتار به عنوان تثبیت کننده سطح ولتاژ استفاده کرده ایم. استفاده از مداری دارای رگولاتور به ما این امکان را میدهد که بدون نگرانی از افت ولتاژهای ناشی از وارد ویا خارج شدن المانها از مدار ویا ولتاژ و جریانهای گذرا ی موجود در سیستم و نویز های محیط ، ولتاژ و جریان مصرفی IC ها را تامین نماییم.
3-2- شرح عملکرد :
می خواهیم زمانیکه به پایه های پورت پرینتر مقدار دهی می کنیم، خروجی مطلوب را بر روی سخت افزار و در نتیجه device ها مشاهده کنیم. سخت افزار طراحی شده این کار را به ترتیب زیر انجام می دهد:
داده ها از طریق سوکت پورت پرینتر از پایه شماره 1 تا 5 وارد سخت افزار می شود، به این ترتیب که از پایه شماره 1 پورت پرینتر وارد پایه شماره 2 از IC شماره SN7475N و از پایه شماره 2 پورت پرینتر وارد پایه شماره 3 از این IC می شود. و به همین ترتیب از پایه شماره 3و4 پورت پرینتر به ترتیب وارد پایه شماره 6 و7 از IC مورد استفاده می گردد.
از آنجا که این IC تنها داری چهار ورودی می باشد، ازIC مشابه دیگری برای کنترل سایر ورودی ها استفاده شده است. بنابراین داده های پایه شماره 5 پورت پرینتر وارد پایه شماره 2 از IC دوم SN7475N می شود.
به دلیل اینکه سیگنال های خروجی از کامپیوتر بسیار ضعیف هستند، باید توسط بافری وارد سخت افزار شوند تا نتیجه مطلوب حاصل آید.و از آنجا که می خواهیم تغییرات ناخواسته در ورودی مانند نویز، خاموش شدن PC وغیره روی سیگنال های ورودی به سخت افزار تاثیر نا مطلوب نگذارد از IC فلیپ فلاپ یا لچ بهره می بریم.
شکل 3-3- مسیر ارسالdata (الف )
شکل 3-4- مسیر ارسالdata (ب )
IC های فلیپ فلاپ احتیاج به پالس سیگنال دارند و از طرفی چون لچ توسط پایه enable قابلیت کنترل بیشتری دارد، از IC SN7475N در این سخت افزار استفاده شده است.این IC دارای 16 پایه و 4 ورودی می باشد که شکل آن ضمیمه شده است.
لازم به ذکر است که این IC دارای خروجی های مستقیم و معکوس شده می باشد و چون در طبقه بعدی از ترانزیستور NPN استفاده کرده ایم، از خروجی های معکوس این IC استفاده می کنیم.
IC شماره 7475 اساساً یک لچ (Latch) منطقی می باشد که در این سخت افزار به عنوان کنترل کننده اطلاعات ورودی مورد استفاده قرار گرفته است.
داده های وارد شده به این IC تا زمانیکه پایه های enable آن فعال نباشد، به خروجی منتقل نمی شود. به این معنی که از پایه enable به عنوان کنترل کننده زمان تغییر خروجی بر اساس ورودی استفاده می شود.
داده های ورودی به این IC به ترتیب از پایه های شماره 1، 14، 11و 8 از IC اول SN7475N و پایه شماره 1 از IC دوم SN7475N خارج می شوند.
نکته مهم در مورد این IC این است که پایه های تغذیه آن استاندارد نبوده و پایه شماره 5 به عنوان Vcc و پایه شماره 12، زمین محسوب می شود.
در این IC هر دو ورودی و دو خروجی با یک enable فعال می شوند.
بنابراین دو پایه enable دارد که پایه شماره 4 برای ورودی های 3 و 4، و پایه شماره 13، enable برای ورودی های 1و2 می باشد.
همانطور که در تشریح خلاصه سخت افزار توضیح داده شد، در طبقه بعد ترانزیستور بکار رفته است.این ترانزیستورها NPN و از نوع BC107 بوده و بصورت استاندارد بایاس شده است و به عنوان تقویت کننده جریان از آن بهره می بریم. اطلاعات خارج شده از IC ِ SN7475N توسط یک مقاومت 1 کیلو اهم وارد بیس(base) ترانزیستور BC107 می شود. این ترانزیستور توسط یک مقاومت 560 اهمی به Vcc مرتبط می گردد و امیتر(emither) آن به زمین مدار متصل است.
داده های معکوس شده در خروجی IC ِ SN7475N مجدداً توسط ترانزیستور BC107 معکوس شده و به شکل داده های اولیه تبدیل می گردد.
این داده های خروجی ترانزیستورها دارای همان مقدار اولیه خروجی از پورت پرینتر رایانه می باشد، با این تفاوت که اکنون توان این سیگنال ها به اندازه ای تقویت شده است که قدرت تحریک بوبین رله ها را داشته باشد.
مزیت استفاده از این ترانزیستورها در این است که به دلیل داشتن بدنه فلزی قابلیت پرت حرارتی بالایی دارد.
خروجی این ترانزیستورها مستقیماً به بوبین رله ها رفته که در مسیر هر یک با یک LED جهت نشان دادن فعال یا غیر فعال بودن رله ها موازی شده اند.
پایه منفی این LED ها توسط یک مقاومت 560 اهمی به زمین متصل می شود.
رله های استفاده شده در این مدار با بوبین 5 ولت و جریان 10 آمپر می باشد.
هریک از این رله ها قابلیت راه اندازی مصرف کننده تا جریان 10 آمپر را دارد. چنانچه در صنعت به جریان هایی بالاتر از این مقدار، برای مثال 50 یا 100 آمپر نیاز باشد، می توان از کنتاکتور(Contactor) برای تامین جریان مصرف کننده های صنعتی استفاده نمود که بوبین آن توسط رله های موجود در مدار تحریک می شود.
برای تامین ولتاژ تغذیه مدار از یک ترانسفورماتور کاهنده استفاده شده است که متشکل از یک پل دیودی با دیودهای 1N4007 و خازن 1000 میکروفاراد 16 ولت می باشد.
در این سخت افزار دو خط Vcc بکار رفته است، که Vcc1 ولتاژ v8 بوده و از آن برای بایاس ترانزیستورها و تامین انرژی مورد نیاز بوبین ها استفاده شده است. Vcc2 ولتاژ v5 بوده و برای تامین تغذیه IC ها بکار رفته است.این ولتاژ v5 از خروجی رگولاتور بدست می آید.
و اما نکات قابل توجهی که در حین کار بر روی این مـجموعه با آنها مواجه ایم، در بخش "پرده ای دیگر" به آن خواهیم پرداخت.
پرده ای دیگر
پایه های enable این IC، Activehigh است و هنگامی که مقدار 1 را دارا شود، اطلاعات ورودی را به پایه های خروجی منتقل می کند. پایه های این IC توسط مقاومت 50 اهم به زمین متصل شده تا به دلیل وجود نویز و یا عوامل ناخواسته دیگر، بطور ناخواسته فعال نشود.
مسئله ای که در عمل با آن مواجه می شویم، این است که هنگامی که کامپیوتر خاموش می شود، به تمام پایه های خروجی پورت پرینتر یک سیگنال 1 می فرستد و در این حالت پایه enable ِ IC ها و پایه های data همزمان یک شده، در نتیجه تمام خروجی های سخت افزار فعال می شود.
برای جلوگیری از بروز این مشکل از IC شماره 7400 استفاده می کنیم.
به این ترتیب که پایه شماره 7 خروجی پورت پرینتر را not کرده و با پایه enable خروجی کامپیوتر که پایه شماره 6 می باشد، AND منطقی می کنیم.
باید توجه داشته باشیم که در تمامی حالت ها پایه 7 صفر بوده و پس از معکوس شدن یک می شود، و هنگامی که پایه enable کامپیوتر نیز یک شود، حاصل خروجی این IC (AND) یک شده و IC های لچ (SN7475N) را فعال می نماید.
اما زمانیکه کامپیوتر خاموش می شود و همه پایه های پورت پرینتر مقدار یک را می گیرند، خروجی پایه شماره 7 معکوس شده و برابر صفر می شود.
حاصل ضرب منطقی صفر حاصله و یک ناخواسته بیت شماره 6 (enable خروجی کامپیوتر) صفر شده و در نتیجه سیگنالی که به پایه enable ِ IC های موجود می رسد، صفر بوده و خروجی حاصل مدار را در حین خاموش شدن کامپیوتر بدون تغیییر نگه می دارد.
برای اینکه بتوان از وجود ولتاژ در سراسر سیستم آگاه بود، از یک LED قرمز رنگ که به خروجی ترانسفورماتور با یک مقاومت 920 اهم متصل شده است، استفاده کردیم.
نکته ظریف اما مهمی که در مورد ولتاژ تغذیه با آن مواجه هستیم، این است که برای تامین ولتاژ رگولاتور جهت داشتن ولتاژ خروجی 5 ولت مطلوب برای استفاده IC ها ترانسفورماتوری تنظیم کرده ایم که ولتاژ 8 ولت را تامین کند.
بنابراین رگولاتور خروجی 5 ولت را برای IC تامین می کند.
چنانچه بخواهیم از این ولتاژ خروجی رگولاتور به عنوان Vcc ترانزیستورها نیز استفاده می کنیم، چون جریان زیادی از رگولاتور کشیده می شود، سبب سوختن آن می گردد.
3-3- مشکلات و راه حلها
برخی از مشکلاتی که درحین انجام این پروژه با آن ها مواجه شدم :
در حین تست حالتهای مختلف سخت افزار با تغییرات ناخواسته و پیش بینی نشده در خروجی مواجه می شدیم. به این دلیل که نویزهای محیطی از مسیر سیمها وارد مدار میشود، لذا مجبور شدیم از سیم شیلد دار برای ارتباط کامپیوتر و مدار استفاده کنیم. شیلد(پوشش) سیم به زمین متصل شدتا نویز موجود به زمین منتقل گردد.
فصل چهارم- جمع بندی و نتیجه گیری
دیدگاه و آینده پروژه را میتوان در صنایع پیشرفته و مترقی تصور کرد.جهت کاهش هزینه ها و توانایی اتصالات مطمئن از نقاط بسیار دور، استفاده از Internet بجای Interanet و انتخاب IP Valid در هر نقطه ای که کنترلر دستگاه در آنجا قرار دارد اجتناب ناپذیر است. بردهای صنعتی قوی با حداقل 1000 خروجی و استفاده از پرتهای تخصصی کامپیوتر که بتوان مصافتی زیاد را پشتیبانی نمود. آشنایی با نقشه های دستگاهها تا کنترلرها ی اجرایی و کنترلرهای کیفیت را مدیریت نمود.امکان دریافت وضعیت و تنظیمات جاری ماشینها تا با این ورودی ،کامپیوتر تصمیمات لازم را اتخاذ و اعمال نمایید.( جهت معرفی سیستم به شبکه اینترنت و معرفی سیستم شخصی بعنوان یکی از سایتهای اینترنتی میتوان از یک ISP معتبر تقاضای Ip Valid نمود.)
ضمیمه1
PHP :
بخاطر استفاده از PHP در تهیه این نرم افزار لازم دیدیم که مروری بر PHP داشته باشیم.
لازم است یادآوری کنم که کدهای موجود به صورت بسیار ساده نوشته شدهاند و امکان دارد که بر حسب سیستم عامل و یا نسخه PHP که بر روی سیستم شما میباشد اجرا نشوند. چنانچه با این مشکل برخورد کردید، عیب را در نحوه نصب PHP و یا سیستم عامل خود جستجو کنید.
ساختن بانک اطلاعاتی (Database):
در این مرحله به ساخت یک بانک اطلاعاتی برای سیستم عضویت میپردازیم. ممکن است شما از phpMyAdmin و یا سایر برنامههای مرتبط با MySQL استفاده کنید ولی من از PHPMyAdmin به خاطر سهولت و همچنین فراگیر بودن آن در اکثر میزبانهای (Host) کاربران ایرانی، استفاده میکنم.
جهت این کار ابتدا یک بانک اطلاعاتی با نام دلخواه بسازید و سپس برای ایجاد جداول و مقداردهی اولیه در قسمت Query Window کد زیر را وارد کنید:
CREATE TABLE users
userid int(25) NOT NULL auto_increment,
first_name varchar(25) NOT NULL default '',
last_name varchar(25) NOT NULL default '',
email_address varchar(25) NOT NULL default '',
username varchar(25) NOT NULL default '',
password varchar(255) NOT NULL default '',
info text NOT NULL,
user_level enum('0','1','2','3') NOT NULL default '0',
signup_date datetime NOT NULL default '0000−00−00 00:00:00',
last_login datetime NOT NULL default '0000−00−00 00:00:00',
activated enum('0','1') NOT NULL default '0',
PRIMARY KEY (userid) ) COMMENT='Membership Information';
sql.txt
لازم به یادآوری است که چنانچه برنامه نویس حرفهای میباشید و یا در زمینه بانکهای اطلاعاتی سر رشته دارید، ممکن است از شیوه آرایش جدولها در این بانک اطلاعاتی خوشتان نیاید که در اینصورت میتوانید به دلخواه آن را تغییر دهید. شیوه جدولبندی و آرایش جدولها در این پست به شیوه معمولی میباشد.
حال که بانک اطلاعاتی مورد نیاز ایجاد شد به سراغ گرفتن اطلاعات از کاربر و ذخیره آن در بانک اطلاعاتی میرویم.
ثبت نام کاربر:
شما میتوانید با HTML یک فرم ساده ایجاد کنید. این کار به راحتی توسط نرمافزارهایی نظیر Front Page و یا DreamWeaver قابل انجام است ولی من یک کد آماده با نام login_from.htm برای شما آماده کردهام که میتوانید از آن استفاده کنید. شما میتوانید با سلیقه خود طرح و شکل آن را عوض کنید. چنانچه خواستید شکل فرم را عوض کنید این نکته توجه داشته باشید که نام فیلدهای فرم به صورت زیر باشد:
first_name ،last_name ،email_address ،username و info.
چنانچه فرم نمونه را تغییر نمیدهید تمام نامها برای هر فیلد درست انتخاب شدهاند و نیازی به تغییر آنها نیست. لازم به یادآوری است کــه خاصیت action فرم باید به مسیر درسـتی (در اینجا register.php) برای فرستادن اطلاعات اشاره کند.
اکنون فایل register.php را باز کنید. به ظاهر کد پیچیدهای است. اماعجله نکنید! در ادامه درباره ساختار کدها و طرز کار هریک از آنها صحبت خواهد شد. اگر به توضیحاتی که در درون کدها نوشته شده است توجه کنید درک آن بسیار ساده و قابل فهم خواهد بود. حال به توضیح برنامه میپردازیم:
<?php
include'db.php';
?>
این خط فایل db.php که حاوی کدهای لازم برای ارتباط با بانک اطلاعاتی میباشد را در بدنه اصلی برنامه فراخوانی میکند. باز هم این نکته را یادآوری میکنم که چنانچه اطلاعات زیادی درباره بانکهای اطلاعاتی و نحوه برنامه نویسی آنها ندارید، حتما آموختههای خود را تکمیل کنید تا فهم و درک مطلب برای شما آسانتر شود. من یک نمونه اتصال به بانک اطلاعاتی را که در db.php نوشته شده در زیر آوردهام. اگر جزو کاربران حرفهای PHP هستید تغییرات دلخواه و یا حتی جدید را میتوانید در db.php انجام دهید:
<?php
$dbhost = "localhost"; // database host
$dbuser = "db_username"; // database username
$dbpassword = "db_password"; // database password
$db2use = "db_name"; // name of database
$conn = @mysql_pconnect($dbhost,$dbuser,$dbpassword)
or die("Connection failed: Please try later.");
$db = @mysql_select_db ($db2use,$conn) or die(Error:.mysql_error());
?>
در مورد کد بالا به نکات زیر توجه کنید:
مقدار dbhost$ در بیشتر موارد localhost میباشد. اما چنانچه غیر از این بود با سرویس پشتیبان سرورتان تماس بگیرید.
dbuser$ نام کاربری بانک اطلاعاتی شما میباشد.
dbpassword$ کلمه عبور بانک اطلاعاتی شما میباشد.
db2use$ نام دیتابیس (بانک اطلاعاتی) مورد استفاده شما میباشد.
برای اتصال به بانک اطلاعاتی از یک mysql_pconnect استفاده کردیم که وظیفه ارتباط دائمی را تا پایان برنامه به عهده داشته دارد. این کار باعث صرفه جویی در زمان اجرای برنامه میشود ولی این نکته حائز اهمیت است که استفاده از یک ارتباط دائمی در بعضی موارد ممکن است به سود شما نباشد و باعث ایجاد بار اضافی بر روی سرور شما شود. سایر دستورات مربوط به بالا واضح است و احتیاج به توضیح ندارند. حال به ادامه توضیحات می پردازیم:
// Define post fields into simple variables
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email_address = $_POST['email_address'];
$username = $_POST['username'];
$info = $_POST['info'];
// Let's strip some slashes in case the user entered any escaped characters
$first_name = stripslashes($first_name);
$last_name = stripslashes($last_name);
$email_address = stripslashes($email_address);
$username = stripslashes($username);
$info = stripslashes($info);
همانطور که از توضیح اول کد مشخص است، اطلاعات فرستاده شده از طریق فرم در متغیرهایی ذخیره میشود. این عمل با استفاده از متد []POST_$ انجام میشود. در قسمت بعد از تابع ( )stripslashes استفاده کردهایم. تابع یاد شده (اسلش)های موجود قبل از ' و " که PHP به طور خودکار به آنها اضافه می کند را حذف میکند. این عمل به خاطر این است که امکان دارد ما اطلاعاتی که توسط کاربر ثبت می شود را دوباره نمایش دهیم. وجود اسلش هنگام فراخوانی اطلاعات از بانک اطلاعاتی موجب بروز خطای دستوری میشود. این قسمت بیشتر در مورد اطلاعاتی است که از فیلد Infromation about you کاربرد دارد زیرا کاربر میتواند هر آنچه را که میخواهد در آن بنویسد.
برای چک کردن اینکه ایمیل درست وارد شده باشد یعنی حاوی @ و . باشد، دستورهای جاوا اسکریپتی بسیاری است که به دلیل پیچیده شدن موضوع آن را به خودتان واگذار میکنیم. حال نوبت به کنترل اطلاعاتی است که کاربر ارسال کرده است:
// Do some error checking on the form posted fields
if((!$first_name) || (!$last_name) || (!$email_address) || (!$username)) {
echo 'You did not submit the following required information! <br />';
if (!$first_name) {
echo "First Name is a required field. Please enter it below.<br />";
}
if (!$last_name) {
echo "Last Name is a required field. Please enter it below.<br />";
}
if (!$email_address) {
echo "Email Address is a required field. Please enter it below.<br />";
}
if (!$username) {
echo "Desired Username is a required field. Please enter it below.<br />";
}
include 'join_form.html'; // Show the form again!
/* End the error checking and if everything is ok, we'll move on to
creating the user account */
exit(); // if the error checking has failed, we'll exit the script!
}
این قسمت بسیار ساده است. شرط اول کنترل میکند که همه فیلدها پر شده باشند. این کار بوسیله عملگر منطقی "یا" "||" انجام میشود. چنانچه یکی از فیلدها خالی باشد، پیغامهای خطای متناظر با آن با آن فیلد بر روی صفحه نشان داده خواهد شد. چنانچه همه فیلدها پر شده باشند و فیلد خالی موجود نباشد کنترل متغیرها متوقف شده و از بلاک شرط با دستور ()exit خارج می شویم. قسمت بعد کنترل اینکه نام کاربری و ایمیل شما قبلا در بانک اطلاعاتی ذخیره نشده باشد:
$sql_email_check = mysql_query("SELECT email_address FROM users WHERE
email_address='$email_address'");
$sql_username_check = mysql_query("SELECT username FROM users WHERE
username='$username'");
$email_check = mysql_num_rows($sql_email_check);
$username_check = mysql_num_rows($sql_username_check);
if (($email_check > 0) || ($username_check > 0)) {
echo "Please fix the following errors: <br />";
if ($email_check > 0) {
echo "<strong>Your email address has already been used by
another member in our database. Please submit a different
Email address!<br />";
unset($email_address);
}
if ($username_check > 0) {
echo "The username you have selected has already been used by
another member in our database. Please choose a different
Username!<br />";
unset($username);
}
include 'join_form.html'; // Show the form again!
exit(); // exit the script so that we do not create this account!
}
دستورات بالا برای آنهایی که در حد متوسط از بانکهای اطلاعاتی سر رشته دارند بسیار ساده است. چنانچه نام کاربری و یا ایمیل قبلا ثبت شده باشد مقدار () mysql_num_rows برابر صفر نمیشود و پیغامهای متناظر با کنترل نام کاربری و یا ایمیل برای کاربر نشان داده میشود و روند ثبت نام قطع شده و پیغام مورد نظر چاپ می شود و در زیر آن دوباره فرم ثبت نام نشان داده میشود. حتما تا به حال با این موضوع در سایت های بزرگ برخورد کردهاید که چنانچه هر کدام از فیلدها به نحوی اشتباه پر شده باشند و یا نام کاربری قبلا ثبت شده باشد صفحه فرم با اطلاعاتی که کاربر هنگام ورود پر کرده تکمیل شده و قسمت مشکل دار با پیغام خطا به رنگ قرمز نمایش داده میشود. برای ساختن چنین روندی به برنامه نویسی پیشرفته و بکارگیری اسکریپتهای مختلفی نیاز داریم که از سطح متوسط این پست خارج است.
function makeRandomPassword() {
$salt = "abchefghjkmnpqrstuvwxyz0123456789";
srand((double)microtime()*1000000);
$i = 0;
while ($i <= 7) {
$num = rand() % 33;
$tmp = substr($salt, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
$random_password = makeRandomPassword();
$db_password = md5($random_password);
کار این تابع ایجاد یک کلمه عبور تصادفی و تبدیل آن به فرمت md5 است. اینکه چرا کاربر اجازه ندارد که خودش کلمه عبور را انتخاب کند دلایلی دارد. یکی از آن دلایل این است که کلمه عبور ساخته شده به ایمیل کاربر فرستاده میشود و این به ما در راستای اینکه آیا ایمیل ثبت شده توسط کاربر ایمیل معتبری میباشد کمک میکند. به عبارتی چنانچه ایمیل فرد معتبر باشد کاربر با رفتن به ایمیل پسورد خود را دریافت میکند. و دلیل دیگر اینکه باایجاد یک کلمه عبور تصادفی و همچنین تبدیل آن به md5 امنیت کلمه عبور بسار بالا میرود و به سادگی توسط هکرها قابل شناسایی نیست.
// Enter info into the Database.
$info2 = htmlspecialchars($info);
$sql = mysql_query("INSERT INTO users (first_name, last_name,
email_address, username, password, info, signup_date)
VALUES('$first_name', '$last_name', '$email_address',
'$username', '$db_password', '$info2', now())") or die (mysql_error());
if (!$sql) {
echo 'There has been an error creating your account. Please
contact the webmaster.';
}
else {
$userid = mysql_insert_id();
// Let's mail the user!
$subject = "Your Membership at MyWebsite!";
$message = "Dear $first_name $last_name,
Thank you for registering at our website, http://www.mydomain.com!
You are two steps away from logging in and accessing our exclusive members
area. To activate your membership, please click here:
http://www.mydomain.com/activate.php?id=$userid&code=$db_password
Once you activate your memebership, you will be able to login with the
following information:
Username: $username
Password: $random_password
Thanks!
The Webmaster
This is an automated response, please do not reply!";
mail($email_address, $subject, $message,
"From: MyDomain Webmaster< admin@mydomain.com>");
echo 'Your membership information has been mailed to your email address!
Please check it and follow the directions!';
}
?>
همانطور که از توضیحات بر میآید، این قسمت جهت ثبت در بانک اطلاعاتی و فرستادن اطلاعات از قببیل پسورد و همچنین لینک فعال سازی به کاربر میباشد. اما تابع ( )htmlspecialchars چه کاری انجام میدهد؟ این تابع تگهای html را به کدهای مربوطه تغییر میدهد برای مثال:
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // <a href='test'>Test</a>
این کار باعث میشود که کاراکترهایی نظیر < > ' به همین صورت در بانک اطلاعاتی ذخیره نشوند و باعث بروز خطاهای دستوری هنگام فراخوانی آنها توسط PHP نشوند.
در قسمت بعد اطلاعاتی که پس از گذراندن از مراحل مختلف آماده ذخیره شدن در بانک اطلاعاتی هستند به وسیله دستورINSERT در بانک اطلاعاتی ثبت میشوند. چنانچه مشکلی در بانک اطلاعاتی وجود نداشته باشد، مرحله بعدی آن که فرستادن ایمیل به کاربر میباشد اجرا میشود. فرستادن ایمیل توسط تابع ()mail انجام میشود. روشهای استفاده از تابع ()mail بسیار است که با مراجعه به help برنامه PHP میتوانید آنها را مشاهده کنید. در این جا سادهترین روش برای اینکار انتخاب شده است. کاربر در قسمت پیام ایمیل چیزی شبیه به آنچه در زیر آمده است مشاهده میکند:
From: MyDomain Webmaster
To: you@email.com
Subject: Your Membership at MyWebsite!
Dear boy from sun,
Thank you for registering at our website, http://www.mydomain.com!
You are two steps away from logging in and accessing our exclusive members area.
To activate your membership, please click here:
http://www.mydomain.com/activate.php?id=3&cod=37ec82769e837c2f853450
Once you activate your memebership, you will be able to login with the
following information:
Username: myusername
Password: msxsag4h
Thanks!
The Webmaster
This is an automated response, please do not reply!
مرحله بعد به روز رسانی پایگاه داده هنگامی که کاربر ایمیل خود را چک کرده و بر روی لینک معتبر سازی کلیک کرده است، میباشد. کد زیر در فایل activate.php ذخیره شده است:
<?
/* Account activation script */
include 'db.php';
$userid = $_REQUEST['id'];
$code = $_REQUEST['code'];
$sql = mysql_query("UPDATE users SET activated='1' WHERE userid='$userid'
AND password='$code'");
$sql_doublecheck = mysql_query("SELECT * FROM users WHERE userid='$userid'
AND password='$code' AND activated='1'");
$doublecheck = mysql_num_rows($sql_doublecheck);
if ($doublecheck == 0) {
echo "<font color=red>Your account could not be activated!</font>";
} elseif ($doublecheck > 0) {
echo "Your account has been activated! You may login below!<br />";
include 'login_form.html';
}
?>
خط اول فراخوانی فایل db.php برای برقراری ارتباط با بانک اطلاعاتی میباشد. پس از گرفتن اطلاعات خواسته شده از طریق لینک فعال سازی، برنامه ابتدا مقدار activate کاربر را در صورت صحت اطلاعات ارسالی برابر با 1 قرار میدهد و در بانک اطلاعاتی ذخیره میکند و چنانچه این عمل با موفقیت انجام شد دوباره کنترل میکند که آیا فعال سازی نام کاربری درست انجام گرفته است یا خیر. چنانچه این قسمت بدون خطا اجرا شود، صفحه ورود کاربر در صفحه ظاهر میشود.
برای ثبت ای پی آدرس بازدید کنندگان سایت تون احتیاج به یک کد بسیار ساده دارید.این کد ای پی بازدید کنندگان شما رو در یک فایل txt ذخیره می کند.
برای استفاد، شما باید این کد را روی سرورتون قرار بدهید و یک فایل txt با عنوان ip درست کنید و تمام مجوزها رو به آن بدهید. دوستان دقت کنند که حتما به این فایل تمام مجوزها خواندن، نوشتن و اجرا را بدهند در غیر این صورت این کد کار نخواهد کرد.
چرا تمام مجوزها را باید به فایل ip.txt داد؟ چون وقتی یک بازدید کننده به سایت شما می آید این کد به صورت اتوماتیک Ip آدرس را در این فایل ذخیره می کند و اگر یکی از مجوزها رو نداشته باشد Ip در فایل مورد نظر دخیره نمی شود.
<?
/* SIMPLE IP LOGGER
For Get Information : Http://zamanphp.blogsky.com/
You Can this Code and Information in about it in : http://zamanphp.blogsky.com/?PostID=19
*/
$log_file = "ip.txt"; // You can change log name file
$ip = getenv('REMOTE_ADDR');
$fp = fopen("$log_file", "a");
fputs($fp, "$iprn");
flock($fp, 3);
fclose($fp);
PRINT("Your Ip Address was .....$ip");
?>
استفاده از تابع تبدیل تاریخ شمسی به میلادی و برعکس استفاده از تابع تبدیل تاریخ شمسی به میلادی و بالعکس در PHPبوسیله یک Copy و Paste متن این توابع را درون یک فایل جدید بنام به عنوان مثال jalali.php ذخیره کنید .
برای اینکه بتوانید از این توابع در برنامه خود استفاده کنید کافیست در ابتدای
برنامه خود دستور زیر را وارد کنید :
<?php require_once "jalali.php\";?>
با این کار دو تابع با نامهای gregorian_to_jalali و jalali_to_gregorian در اختیار
شما قرار می گیرند که به ترتیب برای تبدیل تاریخ میلادی به شمسی و شمسی به میلادی
مورد استفاده قرار می گیرند .
برای اینکه بتوانم نحوه استفاده از این دو تابع را شرح دهم به ذکر مثالهایی در
این مورد می پردازم .
1- تبدیل تاریخ میلادی به شمسی
برای این کار باید از تابع gregorian_to_jalali استفاده کنید . این تابع 3 متغیر
را از ورودی دریافت می کند که به ترتیب سال، ماه و روز می باشد که همگی از نوع
عددی می باشند .
برای مثال اگر بخواهیم تاریخ 2002-11-25 را که درون یک متغیر داریم به شمسی تبدیل
کنیم و سپس آنرا درون یک متغیر قرار دهیم ابتدا باید عناصر تاریخ میلادی رو جدا
کنیم . برای این کار می توانیم در دستور زیر استفاده کنیم :
<?php $gdate='2002-11-25';
list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );
?>
در اینجا از دستور preg_spilit برای جدا کردن عناصر تاریخ $gdate توسط جداکننده
استفاده کرده ایم . همانطور که می بینید syntax این دستور به این صورت است که
2متغیر به عنوان ورودی دریافت می کند . اولی به عنوان delimiter می باشد که چون
می توان به صورت regex نیز آنرا وارد کرد باید بین دو slash (/) قرار گیرد و متغیر
دوم هم که همان متغییری است که تاریخ میلادی ما در آن قرار دارد .
چون خروجی این دستور یک آرایه است از دستور list استفاده کرده ایم تا عناصر آرایه
را هر کدام در یک متغیر قرار دهیم . هم اکنون روز، ماه و سال میلادی را هر کدام
در یک متغیر داریم . حال می توانیم از تابع gregorian_to_jalali استفاده کنیم :
<?php
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
?>
در اینجا مشخص است که 3 متغیر سال، ماه و روز میلادی را به عنوان متغیر های ورودی تابع grogorian_to_jalali وارد کرده ایم و چون خروجی این تابع از نوع آرایه است
توسط دستور list هر کدام از عناصر این آرایه را در یک متغیر قرار می دهیم . این
متغیر های حاوی اطلاعات سال، ماه و روز همان تاریخ به شمسی می باشند . برای اینکه
آنها را به صورت قابل نمایش در یک متغیر قرار دهیم می توانیم این خط را به برنامه
اضافه کنیم :
<?php
$jdate = $jyear."/\".$jmonth.\"/\".$jday;
?>
در صوتیکه مقدار $jdate را نمایش دهید همان تاریخ از نوع شمسی خواهد بود که چیزی
شبیه به مقدار زیر است :
4/9/1381
حال در صورتیکه بخواهید تاریخ همین لحظه را به صورت شمسی بدست آورید می توانید
از برنامه زیر استفاده کنید :
<?php
list($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d\"));
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
$jdate = $jyear.\"/\".$jmonth.\"/\".$jday;
?>
همانطور که ملاحظه کردید از دستور date با آرگومان داده شده تاریخ فعلی سیستم
استخراج می شود و در همان روال توضیح داده شده تبدیل به شمسی شده و در متغیر jdate قرار می گیرد . برای اینکه کارتان کمی ساده تر شود می توانید تابعی به شکل زیر تعریف کنید :
<?php
function get_jalali_date( $gdate='now' )
{
if ( $gdate == 'now' )
{
list($gyear, $gmonth, $gday ) = preg_split ('/-/', date("Y-m-d\"));
}
else
{
list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $gdate );
}
list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);
return $jyear.\"/\".$jmonth.\"/\".$jday;
}
?>
تابعی با نام get_jalali_date تعریف کردیم که یک متغیر به عنوان ورودی دریافت
می کند که این همان تاریخ به میلادی است . در صوتیکه هنگام صدا کردن این تابع تاریخ
میلادی را به عنوان ورودی برای این تابع وارد کرده باشید، تابع همان تاریخ را
به شمسی تبدیل کرده و در خروجی بر می گرداند، ولی اگر هیچ متغیری به عنوان ورودی
به این تابع ندهید، تاریخ همان لحظه را به شمسی برای شما در خروجی بر می گرداند
مثلا برای تبدیل همان تاریخ 2002-11-25 به شمسی و قرار دادن آن در یک متغیر می
توانیم با استفاده از تابع بالا اینگونه عمل کنیم :
<?php $jdate = get_jalali_date("2002-11-25\");?>
و یا برای بدست آوردن تاریخ همین لحظه و قرار دادن آن در یک متغیر اینگونه عمل
می کنیم :
<?php $jdate = get_jalali_date();?>
همانطور که می بینید کار بسیار ساده تر شد.
2- تبدیل تاریخ شمسی به میلادی :با توضیحاتی مشابه می توانید از تابع jalali_to_gregorian استفاده کنید .مانند :
تابع قبل این تابع هم سه متغیر به عنوان ورودی دریافت می کند که عبارتند از سال،
ماه و روز که همگی به شمسی هستند . سپس در جواب آرایه ای شامل سه قسمت که سال،
ماه و روز میلادی همان تاریخ هستند را بر می گرداند .برای نمونه اگر بخواهیم تاریخ 4/9/1381 را به میلادی تبدیل کنیم کاری مشابه برنامه زیر انجام می دهیم :
<?php
$jdate="1381/9/4\";
list( $jyear, $jmonth, $jday ) = preg_split ( '/\//', $jdate );
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, $jday);
$gdate = $gyear.\"-\".$gmonth.\"-\".$gday;
?>
تنها تفاومت موجود با تابع بالا استفاده از / برای جداسازی اجزاء تاریخ شمسی
است . همانطور که گفتیم تابع preg_split آرگومان اول خود که همان delimiter (
جدا کننده ) می باشد را به صورت regex می گیرد که باید بین دو علامت / باشد ،
در اینجا باید قبل / که نشان دهنده کاراکتر delimiter ما می باشد یک \ (back slash
) قرار می دهیم که جداکننده مشخص باشد .
توضیح خاص دیگری هم ندارد و همانند تابع تبدیل میلادی به شمسی اینجا هم می توانیم
تابعی با نام get_gregorian_date بسازیم که کار را راحتتر کند.
آرایه های 2 بعدی آرایه هائی هستندکه عناصرشان خود شامل آرایه می باشند.مثلا آرایه $person
رو در نطز بگیرید.این آرایه شامل 2 عنصر می باشد که دوباره خود عناصر شما ۲ عنصر می باشند.
// تعریف آرایه
$
person
=
array
(
"
fname
"=>("
zaman
","
ali
"),
"
lname
"=>("
rezaei
","
alavi
")
);
برای پردازش این آرایه مثلا(چاپ) از ساختار حلقه
foreach
استفاده می کنیم:
// حلقه
foreach
foreach
($
person
as
$
val
){
foreach
($
val
as
$
value
){
echo
$
value
.'
';
}
}
همچنین می توانیم با حلقه
for
آرایه $person
را پردازش کنیم:
// حلقه
for
for
($
i
=0;$
i
<
COUNT
<
SPAN
>($
person
);$
i
++){
echo
$
person
["
fname
"][$
i
],$
person
["
lname
"][$
i
].
در اولین مرحله به ساخت یک بانک اطلاعاتی برای برنامه خود میپردازیم. ممکن است شما از PHPMyAdmin و یا سایر برنامههای مرتبط با MySQL استفاده کنید ولی من از PHPMyAdmin به خاطر سهولت و همچنین فراگیر بودن آن در اکثر میزبانهای (Host) کاربران ایرانی، استفاده میکنم.
جهت این کار ابتدا یک بانک اطلاعاتی با نام دلخواه بسازید و سپس برای ایجاد جدول و مقداردهی اولیه در قسمت Query Window کد زیر را وارد کنید:
CREATE TABLE users (
id int(25) NOT NULL auto_increment,
username varchar(25) NOT NULL,
password varchar(25) NOT NULL,
fname_user varchar(25) NOT NULL,
lname_user varchar(25) NOT NULL,
actived int(1) NOT NULL,
PRIMARY KEY (id,username) ) TYPE=MyISAM;
ابتدا به توضیح فایل connect.php که ارتباط با پایگاه داده رو میسر می کنه می پردازیم:
<?
php
$
dbhost
="
localhost
"; //
database host
$
dbuser
="
db_username
"; //
database username
$
dbpassword
="
db_password
"; //
database password
$
db2use
="
db_name
"; //
name of
database
$
conn
=
mysql_pconnect
($
dbhost,$dbuser,$dbpassword
)
or
die
("
Connection
failed: Please try later
.");
$
db
=
mysql_select_db
($
db2use,$conn
)
or
die
("
Select DataBase failed: Please try later
.".
mysql_error
());
?>
در مورد کد بالا به نکات زیر توجه کنید:
مقدار dbhost
$
در بیشتر موارد localhost
میباشد. اما چنانچه غیر از این بود با سرویس پشتیبان سرورتان تماس بگیرید.
dbuser
$
نام کاربری بانک اطلاعاتی شما میباشد.
dbpassword
$
کلمه عبور بانک اطلاعاتی شما میباشد.
db2use
$
نام دیتابیس (بانک اطلاعاتی) مورد استفاده شما میباشد.
برای اتصال به بانک اطلاعاتی از یک mysql_pconnect
استفاده کردیم که وظیفه ارتباط دائمی را تا پایان برنامه به عهده داشته دارد.
این کار باعث صرفه جویی در زمان اجرای برنامه میشود ولی این نکته حائز اهمیت است که استفاده از یک ارتباط دائمی در بعضی موارد ممکن است به سود شما نباشد و باعث ایجاد بار اضافی بر روی سرور شما شود. سایر دستورات مربوط به بالا واضح است و احتیاج به توضیح ندارند.
حال به توضیح فایل Display.php که لیست کاربران سایت رو برای ما نمایش می ده می پردازیم :
<?
php
include
'
connect.php
';
$
select_users
=
mysql_query
("
SELECT
*
FROM users ORDER BY id
",$
conn
)
or
die (mysql_error
());
if
(
mysql_num_rows
()==0)
{
echo
'
No Record
';
}
else
{
while
($
RS
=
mysql_fetch_object
($
select_users
))
{
echo
"<
TR
>
<
TD bgColor=#f1f7fc
>
<
DIV
align=right
>".$
RS
->
password
."</
DIV
></
TD
>
<
TD
bgColor=#fcfdfe
>
<
DIV align=right
>".$
RS
->
username
."</
DIV
></
TD
>
<
TD
bgColor=#f1f7fc
>
<
DIV align=right
>".$
RS
->
lname_user
."</
DIV
></
TD
>
<
TD
bgColor=#fcfdfe
>
<
DIV align=right
>".$
RS
->
fname_user
."</
DIV
></
TD
>
<
TD
bgColor=#fcfdfe
>
<
DIV align=center
>
<
INPUT
value
=".$
RS
->
username
."
name=username
>
</
DIV
></
TD
>
</
TR
>";
}
}
در مورد کد بالا به نکات زیر توجه کنید:
در ابتدا فایل connect.php
با دستور include
به برنامه خود فراخوانی کرده ایم تا با پایگاه داده ارتباط برقرار کند مزیت این فایل در این هست که لازم نیست دیگر در هر صفحه برای ارتباط با پایگاه داده دستورات ارتباط رو بنویسیم فقط کافیست این این فایل رو به برنامه خود فراخوانی کنیم.
در قسمت بعد از طریق تابع query , mysql_query
خودمون رو اجرا می کنیم و سپس با تابع mysql_fetch_object
می تونیم سطرهای جدول رو به صورت یک شی از طریق حلقه
while
به خروجی ببریم
توجه داشته باشید که برای هر کاربری که در خروجی چاپ می شود یک عنصر checkbox
در کنارش قرار می گیرد که مقدارش شامل نام کاربری کاربر می باشد
نکته دیگری که لازم هست بدانید این هست که تمام سطرهای ما در یک فرم که action فرم فایل action.php هست قرار می گیرد.برای اینکه منظورم رو متوجه شوید بهتر است به فایل اصلی نگاهی بیندازید.
در ادامه به توضیح فایل Insert.php که کاربران جدید رو به پایگاه داده اضافه می کند
می پردازیم :
چون فرم تعریف کاربر و کد پردارش آن هر دو در این فایل قرار گرفته (یعنی action فرم خود فایل insert.php هست) لذا فقط قسمت پردازش رو که اطلاغات رو تو دیتابیس ذخیره شده را توضیح می دهد:
<?php
if(isset($insert))
{
include 'connect.php';
$username=$_POST['username'];
$password=$_POST['password'];
$fname_user=$_POST['fname_user'];
$lname_user=$_POST['lname_user'];
mysql_query("INSERT INTO users (id,username,password,fname_user,lname_user,actived)
VALUES('$username','$password','$fname_user',
'$lname_user',1)",$conn) or die(mysql_error());
echo 'success insert user';
}
?>
در مورد کد بالا به نکات زیر توجه کنید:
ابتدا مشخص می کنیم که آیا مدیر دکمه insert
را کلیک کرده یا نه .اگر کلیک کرده باشد از طریق فایل connect.php
با پایگاه ارتباط برقرار می کنیم و سپس مقادیر متغییرهای برنامه رواز طریق آرایه POST
_$
مقداردهی می کنیم.
حالا qurty
خود را انجام می دهیم و اطلاعات رو تو پایگاه وارد می کنیم.
در خاتمه به توضیح فایل Action.php(که عملیات حذف,فعال و غیرفعال کردن کاربر را انجام می دهد) می پردازیم:
<?
php
include
'
connect.php
';
//
delete user
if
(
isset
($
delete_user
)){
$
username
=$_
POST
['
username
'];
foreach
($
username
as
$
val
)
{
mysql_query
("
DELETE FROM users WHERE username=$val
",$
conn
)
or
die(mysql_error
());
}
echo
'
deleted
user
!';
}
//
active user
if
(
isset
($
active_user
)){
$
username
=$_
POST
['
username
'];
foreach
($
username
as
$
val
)
{
mysql_query
("
UPDATE users SET actived=1 WHERE
username=$val
",$
conn
)
or
die(mysql_error
());
}
echo
'
actived
user
!';
}
//
unactive user
if
(
isset
($
unactive_user
)){
$
username
=$_
POST
['
username
'];
foreach
($
username
as
$
val
)
{
mysql_query
("
UPDATE users SET actived=0 WHERE
username=$val
",$
conn
)
or
die(mysql_error
());
}
echo
'
unactive
user
!';
}
?>
در مورد کد بالا به نکات زیر توجه کنید:
هنمان طور که مشاهده می نمائید متغییر username
باید به عنوان یک آرایه به آرگومان خلقه foreach فرستاده شود که شما باید در فایل display.php
اون checkbox
هائی رو که در هر سطر برای کاربر چاپ می شود نامش رو بصورت []
username
بنویسید:
در این صورت متغییر به صورت آرایه به عنوان آرگومان به حلقه code>foreach فرستاده می شود در به تعداد checkbox
هائی که کاربر تیک زده در هر بار عبور از حلقه یک کاربر حذف می شود بقیه مراحل برای برای active , unactive
کاربران نیز به همین روش
می باشد
ضمیمه 2
برنامه C# مربوط به form1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
short val;
//val=axHwinterface1.InPort(888);
val = 255;
//axHwinterface1.OutPort(888,255);
MessageBox.Show((convertt(textBox1.Text)).ToString());
//axHwinterface1.OutPort(888,short.Parse(textBox1.Text));
}
private void button2_Click(object sender, EventArgs e)
{
short val;
//val=axHwinterface1.InPort(888);
val = 0;
axHwinterface1.OutPort(888, 0);
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
}
private void dfgfdhgfToolStripMenuItem_Click(object sender, EventArgs e)
{
m1.Checked = !m2.Checked;
m2.Checked = !m1.Checked;
if (m2.Checked == true)
{
notifyIcon1.Icon = new Icon("aab.ico");
notifyIcon1.Text = "فرستنده اطلاعات غیر فعال";
}
}
private void m1_Click(object sender, EventArgs e)
{
m2.Checked = !m1.Checked;
m1.Checked = !m2.Checked;
if (m1.Checked == true)
{
notifyIcon1.Icon = new Icon("aaa.ico");
notifyIcon1.Text = "فرستنده اطلاعات فعال";
}
}
private void m3_Click(object sender, EventArgs e)
{
Close();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
private void pictureBox2_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
private void pictureBox3_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
private void pictureBox4_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
private void pictureBox5_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
private void pictureBox6_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
private void pictureBox7_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
private void pictureBox8_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = !pictureBox1.Enabled;
}
short convertt(string inp)
{
short tmp=0;
if (inp.Length < 8)
{
return (0);
}
else
{
if (inp.Substring(0,1) == "1") tmp = (short)(tmp + 128);
if (inp.Substring(1, 1) == "1") tmp = (short)(tmp + 64);
if (inp.Substring(2, 1) == "1") tmp = (short)(tmp + 32);
if (inp.Substring(3, 1) == "1") tmp = (short)(tmp + 16);
if (inp.Substring(4, 1) == "1") tmp = (short)(tmp + 8);
if (inp.Substring(5, 1) == "1") tmp = (short)(tmp + 4);
if (inp.Substring(6, 1) == "1") tmp = (short)(tmp + 2);
if (inp.Substring(7, 1) == "1") tmp = (short)(tmp + 1);
}
return (tmp);
}
private void button3_Click(object sender, EventArgs e)
{
if (m2.Checked)
{
return;
}
this.Hide();
string st,path;
path = System.IO.File.ReadAllText(@"path.txt");
try
{
st = System.IO.File.ReadAllText(path + @"\onoff.txt");
}
catch
{
st = "0";
}
if (st == "0")
return;
System.IO.File.WriteAllText(path + @"\onoff.txt", "0");
string bin;
decimal decimall;
st = System.IO.File.ReadAllText(path + @"\data.txt");
if (convertt(st)>0)
{
short val;
val = 0;
//MessageBox.Show((convertt(st)).ToString());
axHwinterface1.OutPort(888, convertt(st));
label1.Text =Convert.ToString(convertt(st));
DataChange dc = new DataChange();
dc.label2.Text = (convertt(st)).ToString();
dc.data = st;
dc.Show();
//System.IO.File.WriteAllText(@"c:\unicode.txt", "00000000");
}
//System.IO.File.WriteAllLines(@"c:\unicode.txt", st);
//MessageBox.Show(st[0]);
}
private void timer1_Tick(object sender, EventArgs e)
{
button3_Click(sender,e);
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
Form a=new About();
a.ShowDialog();
}
private void pathOfFilesToolStripMenuItem_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog()==DialogResult.OK)
{
System.IO.File.WriteAllText(@"path.txt", folderBrowserDialog1.SelectedPath);
}
}
private void dsfdsToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void asdsadToolStripMenuItem_Click(object sender, EventArgs e)
{
}
}
}
برنامه C# مربوط به about
namespace WindowsApplication1
{
partial class About
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
this.label1.Location = new System.Drawing.Point(203, 28);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(122, 14);
this.label1.TabIndex = 0;
this.label1.Text = "پروژه پایان تحصیلی ";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
this.label2.Location = new System.Drawing.Point(227, 56);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(76, 14);
this.label2.TabIndex = 1;
this.label2.Text = "انوشه مقدم";
//
// button1
//
this.button1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
this.button1.Location = new System.Drawing.Point(443, 226);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 2;
this.button1.Text = "خروج";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// About
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(530, 261);
this.Controls.Add(this.button1);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Name = "About";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "درباره نرم افزار";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
}
}
برنامه html مربوط به main
<html dir="rtl">
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>New Page 1</title>
<html>
<?php
//print_r($HTTP_POST_VARS);
$fp = fopen("data.txt","w");
if (!empty($HTTP_POST_VARS['c1']))
fputs($fp,"1");
else
fputs($fp,"0");
if (!empty($HTTP_POST_VARS['c2']))
fputs($fp,"1");
else
fputs($fp,"0");
if (!empty($HTTP_POST_VARS['c3']))
fputs($fp,"1");
else
fputs($fp,"0");
if (!empty($HTTP_POST_VARS['c4']))
fputs($fp,"1");
else
fputs($fp,"0");
if (!empty($HTTP_POST_VARS['c5']))
fputs($fp,"1");
else
fputs($fp,"0");
fputs($fp,"1");
fputs($fp,"0");
fputs($fp,"1"); //clock
fclose($fp);
$fp = fopen("onoff.txt","w");
fputs($fp,"1"); //Redy To Start
fclose($fp);
?>
</html>
</head>
<body>
<p align="center"> </p>
<p align="center"><u><font color="#000080"><b>Successfully Send Informations To
Machines</b></font></u></p>
<p align="center"> </p>
<p align="center"><a href="Main.htm">
<img border="0" src="../images/Back_Last.gif" width="160" height="26"></a></p>
</body>
</html>
ضمیمه 3 – مدار داخلی ICهای بكار رفته در سخت افزار
منابع :
]1[ مترجم دیانی – محمود ، بویلستاد - شلسكی ، مدارات میكرو الكترونیك ، انتشارات نوپردازان ، زمستان 83
]2[ توانا - مهر داد ،هرایتان – سعید ، شید رویی - عاطفه ، مرجع كامل PHP4 ،2 138
]3[ مترجم احترامی – بابك ، استفان والتر ، ASP.NET ، انتشارات دانش نگار ، پاییز 1384
[4] Don Lancaster , TTL Cookbook , 1996
[5] Romford Englad , TTL Guide , 1994
[6] www. Enpanorama.NET
[7] www.sc_systems.com
[8] www.beyond logic.org
به نام پاك هستی بخش یزدان
خداوندی كه دل ها را دهد جان
درون سینه از جود وجودش
چراغ عشق و امید گشته تابان
پایان نامه دوره كارشناسی كامپیوتر
گرایش سخت افزار
موضوع :
كنترل قطعات الكتریكی از طریق و
استاد راهنما :
جناب آقای مهندس جواد یزدانجو
استاد داور:
جناب آقای مهندس امیر فرید امینیان مدرس
نام دانشجو :
انوشه مقدم
زمستان 1385
سپاسگزاری
باسپاس فراوان از جناب آقای مهندس یزدانجو که ما را در انجام این پروژه یاری نمودند.
چکیده:
كنترل قطعات الكتریكی از طریق وب
هدف از طراحی و ساخت این پروژه، طرح ایده ای برای کنترل ابزارهای یک واحد صنعتی است به صورتی که از اتلاف نیروی انسانی،هزینه و زمان مفید کاری جلوگیری شود.
کنترل قطعات مختلف یک واحد صنعتی به طور غیر مستقیم و توسط یک کاربر یا هوش مصنوعی، می تواند به بهینه سازی کار و زمان در بخش های دیگر کمک کند.
نمونه ای از یک روش کنترلی که شامل طراحی و ساخت مداری با 5 ورودی ست تشریح شده است. زبانهایی که در خانواده ++C قرار دارند همیشه از کارایی و محبوبیت خاصی در نزد طراحان سخت افزار جهت ارتباط با دستگاههایشان، برخوردار بوده اند. در این پروژه دلیل استفاده از #C ، زیر مجموعه Net2005 نیز همین بوده است اما در و واقع نمیتوان تفاوتی بین آن زبان و Vb.Net در این پروژه قائل گردید. ارتباط با پورت سریال بوسیله OCX ای انجام میگیرد که آنرا در هر زبان از مجموعه Net2005 میتوان بکار برد. بجز نرم افزارهایی که عنوان گردید از ابزارها و نرم افزارهای زیر جهت طرا حی پروژه استفاده شده است:FlashMx - Pspice - Visio - FrontPage - WebStyler - MaxPlus
کلمات کلیدی:
ارتباط مودمی،رگولاتور،بوبین،HTML ، PHP ، IP VALID
فهرست مطالب
عنوان صفحه
دیباچه............................................................................................................................... 1
فصل اول _ پیش درآمد................................................................................................ 3
1-1- لزوم استفاده از اتوماسیون صنعتی................................................................................. 3
2-1- تاریخچه سیستمهای كنترل......................................................................................... 6
1-2-1- سیستمهای پنوماتیك......................................................................................... 6
2-2-1- سیستمهای الكترونیك....................................................................................... 7
3-2-1- سیستمهای كنترل دیجیتال.................................................................................. 8
4-2-1- سیستمهای كنترل غیرمتمركز............................................................................. 8
1-4-2-1- مزایای سیستمهای DCS...................................................................... 10
فصل دوم_شرح نرم افزار پروژه................................................................................... 15
2-1- نرم افزار پروژه.......................................................................................................... 15
2-2- ارتباط مودمی............................................................................................................ 15
2-3- معرفی سایت............................................................................................................. 16
2-4- Run Project........................................................................................................ 17
2-5- Software Detail................................................................................................ 18
2-6- Hardware Detail............................................................................................. 19
2-7- Document Sources ......................................................................................... 20
2-8- Links ................................................................................................................... 21
2-9- Future.................................................................................................................. 22
2-10- نحوه عملکرد برنامه در بخش"ارتباط مودمی"............................................................. 23
2-11- ارتباط با سخت افزار................................................................................................ 24
فصل سوم_شرح عملکرد سخت افزار........................................................... 26
3-1- سخت افزار پروژه در یک نگاه.................................................................................... 26
3-2- شرح عملکرد ........................................................................................................... 29
3-3- مشکلات و راه حلها................................................................................................... 34
فصل چهارم- جمع بندی و نتیجه گیری....................................................................... 35
ضمیمه1............................................................................................................................ 36
ضمیمه 2........................................................................................................................... 63
ضمیمه 3 – مدار داخلی ICهای بكار رفته در سخت افزار........................................................ 73
منابع ................................................................................................................................ 79
فهرست شكل ها
عنوان صفحه
شكل 2-1 – home page................................................................................................ 16
شكل 2-2 – run project............................................................................................... 17
شكل 2-3 – Software Detail...................................................................................... 18
شكل 2-4 – hard Detail............................................................................................... 19
شكل 2-5 – Document Sources................................................................................ 20
شكل 2-6 – Links.......................................................................................................... 21
شكل 2-7 – Future........................................................................................................ 22
شكل 3-1- چارت مسیر data............................................................................................ 27
شكل 3-2- چارت تغذیه.................................................................................................... 28
شکل 3-3- مسیر ارسالdata (الف ).................................................................................... 30
شکل 3-4- مسیر ارسالdata (ب )....................................................................................... 30
این متن فقط قسمتی از دیباچه می باشد
جهت دریافت کل متن ، لطفا آن را خریداری نمایید