مشکل در لاگ گرفتن

در حال نمایش 15 نوشته (از کل 17)
  • نویسنده
    نوشته ها
  • #469
    modir
    سرپرست کل

    من یه برنامه نوشتم که 6400 هر 3 ثانیه به یه دستگاه روی مدباس وصل می شه و 130 تا پارامترو می خونه و توی 130 تا خونه ساین ورد قرارش می دهبعد هر 1 دقیقه این 130 تا رو تو فایل می نویسم الان مشکلم اینه که گاهی دستگاه ریست می شه برنامه رو می ذارم اینجا لطفا کمک کنید

    #470
    modir
    سرپرست کل

    احسان
    1392/9/10 8:24 AM

    فایل برنامه رو هم گذاشتم

    نمی دونم تو نوشتن تو فایل این اتفاق می افته یا مشکل تو خوندن از دستگاه تو مدباسه

    برای نوشتن تو فایل همون اول فایل رو برای نوشتن باز می کنم و روش اطلاعات رو می نویسم
    اگر تو نوشتن مشکل باشه فایل رو می بندم

    یه بلوک power up status هم گذاشتم که بفهمم برنامه ریست کرده یا برقش قطع شده . این بلوک رو که تست می کنم می بینم چه watch dog عمل کنه و چه برقش قطع بشه در هر صورت مقدارش صفره . نمی دونم چطور باید استفاده اش کرد . قاعدتا باید بعد از این که به هر دلیل ریست شد مقدار تو خروجی بلوک باید نشون دهنده نوع ریست باشه .. هلپی هم که نداره

    لطفا کمک خواهش

    لاگ

    #471
    modir
    سرپرست کل

    محسن
    1392/9/10 4:42 PM

    سلام

    برنامه تون کمی بی نظم و خیلی حجیمه!

    خروجی power status وقتی دستگاه خاموش و روشن بشود برابر صفر و وقتی با watch dog ریست شود برابر یک می شود.
    شما از کجا مطمین هستید که دستگاه تان ریست می شود؟

    در network پنجم (Open for write Error) تابع save sample چک می کنید اگر فایل به درستی باز نشده بود ادامه ندهد، به network آخر رفته و فایل بسته شود در صورتی که اگر فایل به درستی باز نشده باشد چیزی برای بسته شدن هم وجود نخواهد داشت و بنابراین دستگاه ریست خواهد شد.

    نکته دیگر اینکه شما بعد از نوشتن هر متغیر در فایل در صورتی که خطایی نباشد به network آخر jump کرده و فایل را می بندید! با این کار فقط اولین متغیر در فایل نوشته خواهد شد و از بقیه صرف نظر می شود.

    برای نوشتن تعداد زیادی متغیر لازم نیست برای هر کدام جداگانه عمل کنید و یک network ایجاد کنید.
    متغیرهای خود را به صورت متوالی در حافظه قرار دهید و با استفاده از تابع indirect assign و آدرس دهی مناسب، متغیرهای مورد نظر خود را به یک متغیر ثابت انتقال داده، آن را به string تبدیل کرده و در فایل بنویسید. بعد از نوشتن هر متغیر آدرس را با مثلا 2 (چون متغیرهای شما word هستند که هر کدام 2 بایت می شود) جمع کرده و این عمل را تکرار کنید تا به آدرس آخرین متغیر برسید (همان for در کدنویسی).

    #472
    modir
    سرپرست کل

    ممنون از پاسختون

    1-
    از این بابت مطمین هستم که چراغ run دستگاه خاموش و بعد مدت کوتاهی روشن می شود

    2-
    درباره اینکه وقتی فایل به درستی برای نوشتن باز نشده باشد من تصور می کردم فایل باز شده ، اما دارای مشکل می باشد و به این لحاط تصور می کردم که باید بسته شود
    بنابراین به گفته شما در صورتی که فایل به درستی باز نشده باشد احتیاج به بستن نیست و می توان مثلا به ابتدای همان save sample جامپ کرد تا مجددا برای باز کردن فایل اقدام نماید . آیا برداشت من درست است ؟

    3-
    در مورد این که در صورت عدم write در هر سطر فایل close می شود . بله درست است . این به این خاطر است که می خواستم مطمین شوم آیا write همه سطرها درست انجام می شود یا نه ؟
    حال در همین صورت راهکار شما چیست ؟ یعنی فرض کنیم در write در یکی از سطرها در write d یک پارامتر دچار مشکل شده باشد . حال چه باید کرد؟ ایا ان سطر را می توان پا ک کرد ؟

    4-
    در مورد آخر نیز حق با شماست می توان با indirect assign این عمل را انجام داد . اما آیا در روش اعمالی من اشکالی وجود دارد ؟ ایا باعث مشکل می شود ؟

    با ز هم از همراهیتون متشکرم

    #473
    modir
    سرپرست کل

    در ضمن با توجه به گفته های آقای محسن عزیز من برنامه رو اصلاح کردم که اینجا هم می ذارم
    در این وضعیت تایید می فرمایید محسن عزیز ؟

    log2

    #474
    modir
    سرپرست کل

    ج 2 : وقتی فایل به درستی باز نشده باشد بهتر است به network آخر یعنی NOP جامپ کنید.
    چون جامپ کردن به networkهای قبلی وقتی شرط مشخصی برای خروج نداشته باشد ممکن است یک حلقه بی نهایت ایجاد کند. در حالتی مثل نوشتن متغیرها در فایل که از جامپ به network قبلی استفاده کرده اید برنامه با رسیدن شاخص به 261 از حلقه خارج می شود و مشکلی نیست ولی در قسمت باز کردن فایل اگر به هر دلیلی نتواند فایل را ایجاد کند همیشه در این حلقه باقی می ماند و چون روال عادی برنامه است و دستگاه از کار نیافتاده، watch dog نیز عمل نخواهد کرد.

    ج 3 : مثل اینکه من این قسمت را به درستی متوجه نشده بودم و تصورم این بود با درست نوشته شدن به network بسته شدن فایل جامپ می کنید ولی شما در صورتی که متغیری به درستی در فایل نوشته نشود از نوشتن بقیه صرف نظر می کنید.
    به نظرم این کار لزومی ندارد؛ خوب ممکن است از تعداد زیاد متغیری که دارید تنها یکی از آنها به درستی نوشته نشود و بقیه کامل باشند. البته اگر فایل به درستی ایجاد شده باشد این مورد هم به ندرت پیش خواهد آمد .

    ج 4 : شاید نتوان گفت که روش قبلی شما اشکال خاصی ندارد ولی اصلا بهینه نیست. شما به جای یک خط برنامه 150 خط نوشته اید؛ علاوه بر زمان بر بودن برای یک بار نوشتن حال تصور کنید می خواهید اصلاحی در این روند انجام دهید!

    * اشتباه دیگری که در چند جای برنامه شما وجود دارد این است که در یک network متغیری را محاسبه می کنید و در همان network و به موازات آن محاسبه، متغیر را مثلا برای مقایسه استفاده می کنید. این کار به این دلیل اشتباه است که دو تابع که به موازات هم در یک network قرار می گیرند ترتیب مشخصی برای اجرا شدن ندارند و معلوم نیست که کدام یک قبل از دیگری اجرا می شود.
    بنابراین دو تابعی را که یک متغیر مشابه دارند و نتیجه یکی در دیگری استفاده می شود اگر نمی توانید به صورت سری استفاده کنید، باید در دو network جداگانه و به ترتیب دلخواه قرار دهید.

    یکی از این موارد در برنامه شما همان جایی است که error ناشی از نوشته نشدن درست متغیرها در فایل را با صفر مقایسه می کنید که ممکن است اول مقایسه انجام شود و بعد در تابع دیگر مقدار error محاسبه شود. یکی دیگر از موارد هم شکل زیر است:

    متغیر های مشابه در یک نتورک
    متغیرهای مشابه در یک نتورک

    #475
    modir
    سرپرست کل

    منون محسن عزیز از راهنمایی های خوب شما
    تمام موارد رو اصلاح کردم

    چند سول دیگه برام مطرح می شه .

    1-
    اگه یه موقعی کنترلر در حال write روی یه فایل باشه و مثلا برقش قطع بشه ، ایا write درست انجام می شه ؟ ایا ممکنه فایل خراب بشه ؟

    2-
    وقتی که باطری کنترلر ته می کشه( که متاسفانه روی سری 6 این مشکل هست ) ساعت و تاریخ دستگاه پاک می شه و یه عدد بی ربط روی year می شینه مثلا 256
    اسم فایل لاگ هم بر اساس تاریخ هستش . ماه و روزش خارج ار رنج نیست
    حالا وقتی باطری دستگاه تموم می شه اون فایلی که ساخته می شه رو نمی شه پاک کرد . انگار فایل مشکل داره . اسم فایل می شه مثلا 256-1-3
    نمی دونم چه کار برای این موضوع می شه کرد

    ممنون می شم

    #476
    modir
    سرپرست کل

    احسان
    1392/9/18 4:26 AM

    با سلام
    مجدد
    من اصلاحات شما رو به کار بستم
    یه بخشی هم گذاشتم که اگه دستگاه ریست کرد تو ای2 پیرام یه مقدار 1 می نویسم که متوجه بشم

    الان اتفاقی که می افته اینه که طاهرا دستگاه ریست نمی شه . مقادیر پارامترای دستگاه بعد از مثلا 1 روز یه دفعه همشون صفر می شن
    لاگ دستگاه هم اینو نشون می ده
    من تصور می کنم اینبار شاید مربوط به خواندن از اسلیو باشه که هر 3 ثانیه صورت می گیره
    ایا چنین چیزی ممکنه . یعنی تو خوندن از اسلیو یه دفعه همه رو اشتباه بخونه
    من باید 110 تا word رو از اسلیو بخونم که اگه یه باره این کارو بکنم همه رو صفر می خونه . برای این منطور اومدم تو 4 مرحله می خونم . یعنی 3 تا 30 ورد و اخرش یه 20 ورد می خونم که می شه همون 110 تا .
    در واقع بشتر از 30 ورد که می شه 40 بایت رو یه دفعه نمی خونم . ایا این تعداد خوندن یه باره هنوز زیاده . بهتره چقدر باشه . چون یادمه وقتی 40 تا ورد رو هم یه دفعه می خوندم همه رو صفر می خوند و با سعی و خطا به عدد 30 رسیدم . اما الان بعد از مدت طولانی تری این اتفاق می افته مثلا یه روز .
    نمی دونم چه اشکالی هست . ایا اشکالی در روشم وجود داره . باود ریت دستگاه هم 9600 هستش . که تصور می کنم اگه پایین تر باشه مطمین تره به این خاطر از 9600 بالاتر نبردمش

    لطفا راهنمایی بفرمایید
    برنامه رو هم ضمیمه کردم
    log3

    #477
    modir
    سرپرست کل

    طول فریمی ای که برای خواندن از/نوشتن در یک دستگاه در شبکه (اترنت و سریال) استفاده می کنیم بر حسب بایت می باشد نه word یا long و … و آدرسی هم که برای انتقال از/به آن نقطه در تابع وارد کنیم آدرس بایتی آن نقطه از حافظه است.
    بنابراین برای خوانده مثلا 110 عدد word از slave باید طول فریم را 220 وارد کنید.

    نوع داده ای که برای طول فریم در بلوک های مربوط به شبکه سریال استفاده می کنید هم بایتی است بنابراین شما می توانید در یکبار خواندن/نوشتن به اندازه 255 بایت داده انتقال دهید و برای بیشتر از این مقدار باید از چند فریم استفاده کنید.

    دقت کنید که آدرس هایی که باید در بلوک های read/wrie سریال وارد کنید یکی کمتر از آدرسی است که در symbol editor می بینید.

    مثال: می خواهید 110 متغیر word را از یک دستگاه slave که ID آن 2 است توسط یک دستگاه master بخوانید. فرض کنید متغیر word اول در خانه 27 word حافظه slave است که آدرس بایتی آن می شود 53 و مقادیر خوانده شده بایستی در 110 ورد از حافظه master قرار بگیرند که آدرس word اول در حافظه master هست 12 که معدل بایتی آن می شود 23. برای این کار تنظیمات تابع read from pac به صورت زیر خواهید بود:
    ID: 2
    Des: 22
    Scr: 52
    Len: 220
    پس کافی است به شکل زیر عمل کنید:
    خواندن از دستگاه slave

    #478
    modir
    سرپرست کل

    پاسخ تاپیک یکی قبل از آخری یعنی : “1392/9/11 8:44 PM”

    ج 1 : اگر در حال نوشتن در فایلی باشید یعنی فایل باز باشد و برق دستگاه قطع شود ویا دستگاه را stop کنید تنها اطلاعاتی که از آخرین بار باز شدن فایل نوشته بودید ثبت نخواهد شد.
    اگر در مد 1 در فایل می نوشتید که خوب هیچ داده ای ثبت نخواهد شد چون مد 1 هر بار که فایل را باز می کند اطلاعات قبلی را پاک می کنید. ولی اگر در مد 2 کار می کنید فقط اطلاعات بازه آخر را نخواهید داشت و پس از یکبار خاموش و روشن کردن دستگاه فایل شما در دسترس خواهد بود.

    بنابراین اگر به سرعت ذخیره سازی بالایی نیاز ندارید بهتر است هر بار که فایل را برای نوشتن باز می کنید، در انتهای عملیات ثبت داده ببندید تا در صورت قطع برق داده های شما از بین نرود.
    ذخیره سازی با سرعت بسیار بالا هم معمولا برای کارهای آزمایشگاهی و در مواردی است که کل بازه زمانی ثبت داده ها چندان طولانی نیست و امکان قطع برق در این موارد نادر است.

    ج 2 : در دستگاه های سری 6000 با تمام شدن باطری دستگاه، دیگر از طریق اترنت به کارت حافظه دسترسی ندارید تا فایل های روی آن را پاک یا ویرایش کنید و پس از تعویض باطری و تنظیمات مجدد اترنت به فایل ها دسترسی خواهید داشت.

    #479
    modir
    سرپرست کل

    منون از پاسختون
    در مورد آدرسها باید بگم من از پروتکل مدباس استفاده می کنم به این خاطر اون ادرسها ورد هستند

    از متن هلپ read pac block :

    در صورتی که پروتکل انتخابی شبکه Modbus باشد، در ورودی Scr باید آدرس Word از حافظه دستگاهی که اطلاعات باید از آنجا خوانده شود قرار گیرد. در این حالت Word اول حافظه دستگاه مربوطه، Word0 و Word دوم Word1 و … در نظر گرفته می شود. در واقع تو read مدباس ادرسای src , des باید وردی باشند

    البته یه اشکالی در هلپ هم وجود داره اونم اینه که در write pac برای مودباس هم گفته ادرسهای src,des باید ورد باشند . اما من وقتی ادرس scr رو بایتی و ادرس des رو وردی گذاشتم تا write تو ادرسهای مختلف رو بتونم بسازم .

    1- محسن عزیز من تو خوندن مشکلی ندارم و حتی تونوشتن . همیشه درست خونده و نوشته می شه .

    همونطور که گفتم در بعضی موارد در حال خوندن این اتفاق می افته که همه یه دفعه صفر می شن و من نمی دونم چی ممکنه باعث این بشه که همه داده های خونده شده صقر بشن . یعنی بعد از چند ساعت یه دفعه می بینم همه ادرسا پاک شدن

    توضیح این که در واقع من ابتدا اسلیو رو به 6400 وصل می کنم داده ها خونده شده و در حافظه دستگاه ریخته می شن .( حافظه با یه سری مقادیر پر می شن )

    بعد ارتباط 6400 رو از اسلیو قطع می کنم . در این حالته که اون اتفاق می افته و بعضی وقتها بعد 4 ساعت و گاهی بیشتر که می گذره همه پارامترا از حافطه پاک کی شن .( یعنی 0 می شن . کل حافظه ram پاک می شه . )

    یاد آوری می کنم که من کلا ارتباط 6400 رو با اسلیو قطع می کنم یعنی کابل ارتباطشونو جدا می کنم . و انتظار دارم این مقادیر فیکس باقی بمونن

    2- همونطور که گفتم من power st رو هم چک می کنم که ببینم watch dog عمل کرده یا نه . نه برق دستگاه قطع شده و نه watch dog عمل کرده .

    البته با این اوصاف نمی دونم واقعا watch dog عمل کرده یا نه . چون نمی دونم power st رو درست استفاده کردم یا نه ؟نظرتون راجع به نحوه استفاده من از power st چیه ؟

    اگه اینا نباشه ایا چیز دیگه ای می تونه باعث پاک شدن حافظه بشه ؟

    3- ایا موقع read کردن وقتی دستگاه slave اصلا وجود نداره watch dog عمل می کنه ؟ اگه اینظوره کی به کی عمل می کنه ؟

    4- من حس می کنم وقتی اسلیو قطعه watch dog بعد یه مدتی عمل می کنه که منظم هم نیست اما power st اینو نشون نمیده . کنترلر من 6400 هستش .ایا درست فکر می کنم

    #480
    modir
    سرپرست کل

    در مورد آدرس دهی چون از پروتکل مدباس استفاده می کنید پس درست هستند.

    از کجا می دانید که برق قطع نشده است؟!
    چون تا وقتی master اطلاعاتی را به درستی از slave نخواند داده ای در حافظه ذخیره نمی کند.

    دستگاه slave شما چیست و 6400 با چند دستگاه شبکه شده است؟

    برای اطمینان از صحت ارتباط و تاثیر عوامل دیگر می توانید گام به گام برنامه خود را به پیش ببرید؛ یعنی ابتدا یک برنامه ساده برای خواندن 110 ورد در هر ثانیه بنویسید و در شرایط مختلف وجود یا عدم وجود slvae چک کنید. یک برنامه خیلی ساده که به صورت زیر می شود:

    تست

    #481
    modir
    سرپرست کل

    —کلا یه دستگاه plc به 6400 وصل هستش
    من اول plc رو به 6400 وصل می کنم . در این حالت بع عنوان مستر داده ها رو خونده و توحافطه اش می ریزه . بعد می ام این دو تا رو از هم جدا می کنم . یعنی فرض کنید اصلا plc رو خاموش می کنم . تو این حالته که بعد از چند ساعت می بینم کل حافطه پاک شده .

    2 — من نمی تونم یه دفعه همه رو با هم بخونم . وقتی این کارو می کنم همه رو صفر می خونه . به همین خاطر تعداد اونارو کم کردم و به 30 تا ورد که کاهش می دم خوندن انجام می شه

    #482
    modir
    سرپرست کل

    محسن
    1392/9/19 7:14 PM

    دستگاه اسلیو شما از محصولات فراروپایاست؟
    تا زمانی که ارتباط قطع نشده مقدار داده ها را به درستی می خوانید؟

    پیشنهاد من به شما این است که یک برنامه ساده مانند برنامه ای که در تاپیک قبل ذکر شد در دستگاه 6400 نوشته و نتیجه آن را اعلام کنید. یعنی یک برنامه که با فواصل زمانی مثلا 1 ثانیه تعداد 110 متغیر ورد را از اسلیو بخواند. البته اگر تعداد وردهای شما 130 عدد باشد باید در دو فریم این کار را انجام دهید چون طول مجاز فریم 255 بایت است.

    تحلیل برنامه شما کمی دشوار است! به نظر می آید بعد از اینکه متغیرها را از اسلیو می خوانید، همان متغیرها یا متغیرهای دیگری را از مستر در همان آدرس ها و در اسلیو می نویسید؟!

    لطفا برنامه خود را کمی ساخت یافته بنویسید! با این کار تحلیل و عیب یابی برنامه برای شما و مخصوصا افراد دیگر راحت تر خواهد بود.
    یعنی از متغیرهای مناسب استفاده کرده و به جای استفاده از تعداد زیادی بیت برای تغییر وضعیت به صورت مرحله ای این کار را انجام دهید. مثال های بخش برنامه نویسی ساخت یافته که در سایت قرار داده شده است کمک زیادی به شما خواهد کرد.
    برای نمونه به جای استفاده از w1 و w2 و w3 و w و R می توانید یک متغیر تعریف کنید که وقتی مقدار آن 1 است عملیات خواندن، وقتی 2 است عملیات نوشتن، وقتی 3 و 4 و … است وظایف دیگری را انجام دهد. با این کار دیگر لازم نیست برای سوییچ کردن بین چند وضعیت مثل خواندن و نوشتن دو یا چند بیت را تغییر دهید که هم امکان اشتباه و فراموشی بیشتر شود و هم تداخل خواندن و نوشتن به وجود آید چون در هر مرحله مطمینا یک کار انجام خواهد شد.

    نکته دیگر اینکه برای خواندن تعداد زیادی داده و نوشتن آن ها در فایل لزومی به تعریف متغیر برای همه آنها نیست و کافی است فضای حافظه مورد نیاز خود را رزرو کنید. یعنی برای 130 متغیر ورد مثلا آدرس 101 تا 230 وردی حافظه را در نظر بگیرید و متغیر دیگری در این محدوده تعریف نکنید. با این کار هم در وقت خود صرفه جویی می کنید و هم جستجو، ویرایش و بررسی متغیرهای دیگر در symbol editor راحت تر خواهد بود.

    #483
    modir
    سرپرست کل

    دستگاه دوم از سری فرارو نیست .
    موقع خواندن و اتصال هیچ مشکلی ایجاد نمی شود و داده ها هم درست خوانده می شوند
    من write رو اصلا انجام نمید م مگر از طریق یه صفحه وب که اونم دایمی نیست . یعنی هر وقت user بخواهد write انجام می شود . و تنها read دایمی است
    مورد شما در مورد خواندن با یه برنامه ساده را انجام می دهم و نتیجا اش را می گذارم

در حال نمایش 15 نوشته (از کل 17)
  • شما برای پاسخ به این جستار باید وارد تارنما شوید.