اطلاعیه

Collapse
No announcement yet.

مشکل ارتباط سریال در سیمولینک

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل ارتباط سریال در سیمولینک

    سلام

    من میخام تو سیمولینک بتونم با پورت سریال تبادل دیتا داشته باشم .

    تو بخش تولباکس ها با Instrument Control Toolbox مشکلی نیس . هم میشه دیتا رو خوند و هم نوشت

    من برای مانیتور کردن از نرم افزار Eltima Serial Port Monitor استفاده می کنم

    مساله سر اینه که من در سیمولینک وقتی میخام با یک وسیله خارجی ارتباط بگیرم از کتابخونه Instrument Control بلاک To Instrument رو میارم می تونم به راحتی دیتا رو بفرستم اما نمی تونم با بلاک Query Instrument دیتا رو بخونم

    البته اگر بخام دیتایی رو که خودم با To Instrument می فرستم به پورت سریال رو با Query Instrument بخونم باید از یک سوکت به شکل زیر استفاده کرد . در این حالت دیتا رو می خونه





    ولی این Query Instrument لعنتی نمی دونم چرا از بیرون نمی تونه دیتایی رو دریافت کنه



    #2
    پاسخ : مشکل ارتباط سریال در سیمولینک

    سلام.
    من یادمه که از بلوک های Serial Send و Serial Receive استفاده کرده بودم که مشکلی نداشت، الان متلب رو کامل نصب نکردم و این بلوک ها رو ندارم و نمیتونم مثال بذارم.
    لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
    لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
    با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
    اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
    يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

    دیدگاه


      #3
      پاسخ : مشکل ارتباط سریال در سیمولینک

      نوشته اصلی توسط هـادی
      سلام.
      من یادمه که از بلوک های Serial Send و Serial Receive استفاده کرده بودم که مشکلی نداشت، الان متلب رو کامل نصب نکردم و این بلوک ها رو ندارم و نمیتونم مثال بذارم.

      سلام

      می بخشید بدجور گیر کردم ! باید سریعا این پروژه رو تحویل بدم

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


      اگر نمونه کد هم تو محیط کامند دارید اون رو هم محبت کنید بزارید




      مرسی

      دیدگاه


        #4
        پاسخ : مشکل ارتباط سریال در سیمولینک

        سلام. همون طور که قبلاً گفتم تولباکسی که بلوک های اشاره شده توش بوده نصب ندارم ولی یک نمونه کد متلب میذارم امیدوارم کارت راه بیفته.

        [code=matlab]s = serial('COM3'
        s.BaudRate = 115200;
        s.Parity = 'none';
        s.StopBit = 1.0;
        fopen(s)


        str = floor(255*rand(100,1));
        fwrite(s,str,'uint8','async&#039
        pause(1)
        fwrite(s,[1,2,3],'uint8','async&#039

        Inp = fread(s,s.BytesAvailable);

        pause(2)
        fclose(s)
        delete(s)
        clear s[/code]
        لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
        لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
        با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
        اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
        يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

        دیدگاه


          #5
          پاسخ : مشکل ارتباط سریال در سیمولینک

          سلام مجدد

          ممنون از وقتی که گذاشتید



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

          کل قضیه اینه که میکرو داره سریال یه سری عدد پشت سر هم برام می فرسته که مقادیر چند تا پتانسیومتره و من باید با توجه به اونها در یک کنترلر فازی مقادیر موقعیت موتور رو به میکرو بفرستم .

          بازه اعداد بین 1000 تا 26000 هست مثلا یه رشته اینجوری میاد :

          2
          5400
          9510
          12480
          6

          اون 2 و 6 رو همین جوری واسه ابتدا و انتهای رشته در نظر گرفتم (می دونم که کار استانداردی نیس)


          حالا چیزی که تو ذهنم دارم اینه که یه آرایه a=[0,0,0]; اینجوری تعربف کنم و یه برنامه اینجوری بنویسیم :

          کد:
              if r==2
                x=1;
              elseif r==6
                x=0;
              end
          
              if (x==1 & r~=2 & r~=6)
                z=z+1;
                a(z)=r;
              elseif z==6
                z=0;
              end
          یعنی r که ورودیه بخونمش و اگر رشته کامل رو که بین 2 و 6 هست دارم دریافت می کنم تو خونه های a ذخیره کنم . بعد بدمش فازی و بعدش ارسال کنم به میکرو .



          شرمنده واقعا میشه یه راهنمایی بفرمایید . چون زیاد تو برنامه نویسی حرفه ای نیستم . با تشکر

          دیدگاه


            #6
            پاسخ : مشکل ارتباط سریال در سیمولینک

            راستی یادم رفت بگم .

            یه مشکلی که هست اینه که وقتی دیتاهای من با اینتر فرستاده میشه ، وقتی دستورات خوندن سریال رو می نویسم مثل اسکن اف یا گت اس ؛ عملا خروجی فقط 2 رو برمیگردونه . اما اگر رشته بدون اینتر باشه حدودا ده تا از این رشته ها رو می خونه .

            خوب حالا اگر من دیتاها رو بدون اینتر بفرستم چجوری باید اعداد رو از داخلش استخراج کنم ؟؟!!!

            دیدگاه


              #7
              پاسخ : مشکل ارتباط سریال در سیمولینک

              برای خواندن دیتا از دستوری که در خط 13 برنامه نوشتم استفاده کن(بودن یا نبودن کاراکتر اینتر تأثیری نداره) . با این دستور کل دیتای بافر دریافت یکجا خوانده میشه و بعد میتونی دیتای بین header و footer رو استخراج کنی و هر کاری دوست داری باهاش انجام بدی. متلب محدودیت هایی در کار real-time داره به همین خاطر نمیشه در حالتی که مشغول کار دیگه ای هست دریافت دیتا رو بایت به بایت داشته باشی به همین خاطر مجبوری کل بافر رو بخونی، چون تایمر هم نمیشه تعریف کرد که مثلاً هر n میلی ثانیه بافر رو بخون و کارهای لازم رو انجام بده، باید با یک حلقه به بافر سر بزنی و استفاده از دستور pause تأخیر ایجاد کنی. در ضمن توجه کن که در صورتی که برنامه ی داخل حلقه زمان زیادی طول بکشه داده زیادی در بافر جمع میشه که نمیشه کار real-time انجام داد.
              لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
              لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
              با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
              اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
              يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

              دیدگاه


                #8
                پاسخ : مشکل ارتباط سریال در سیمولینک

                سلام

                سپاس بابت وقتی که میزارید :job:


                خوب من تا یه جاهایی رفتم . دیتا رو از میکرو به این صورت ارسال می کنم :

                S 0000 1111 2222 3333 4444 E


                چهار تا عدد چهار رقمی که بین اس و ئی قرار دارن و اینم کدی که نوشتم :


                کد:
                clc;
                
                  s=serial('com1');
                  set(s,'BaudRate',9600,'StopBits',1,'Parity','none' ,'DataBits',8);
                  fopen(s);
                  
                  
                    
                    x=fscanf(s);
                    y=sscanf(x,'%*s %d %d %d %d %*s');
                
                    UD=readfis('ud');
                    LR=readfis('lr');
                
                    OFud=evalfis([y(1),y(2)],UD); 
                    OFlr=evalfis([y(3),y(4)],LR);
                
                    oud=fix(OFud*100);
                    olr=fix(OFlr*100);
                  
                  
                    
                  fclose(s);
                  delete(s);
                  clear s;

                دو تا مشکل دارم :


                1) هر چی از دستورات اف رایت و اف پرینت استفاده می کنم که دیتا رو ارسال کنم ظاهرن نمیشه ! میشه فرم صحیحش رو بهم بگید لطفا
                مثلا بخوام همچین چیزی رو بفرستم چی میشه ؟ S000111222E

                2) چجوری حلقه بی نهایت درست کنم ؟ ( بغیر از while 1 )
                میخام یجوریایی مثه سیمولینک وقتی ران میشه اجرا شه تا وقتی که استپ بزنیم . میشه چیزی نوشت که مثلا با زدن کلید Esc از برنامه خارج بشه ؟


                با تشکر

                دیدگاه

                لطفا صبر کنید...
                X