Thông báo

Collapse
No announcement yet.

Giup em tao khoi moi trong Matlab su dung S-Function Builder

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giup em tao khoi moi trong Matlab su dung S-Function Builder

    Bac nao biet cach tao khoi moi trong matlab su dung S-Function Builder xin chi cho em voi. Em co bai tap :tao khoi PID trong S-Function Builder,cac bac giup em, em dang can gap lam, doi on cac bac nhieu!

  • #2
    S-function builder là công cụ giúp người dùng có thể tạo S-function một cách tự động thông qua việc đưa vào tên khối, tham số, đầu vào-ra, viết một số hàm cần thiết để tạo một S-Function. Ngoài ra bạn cũng có thể tạo bằng tay bằng cách lập trình dạng mex-file để tạo các khối mới tuỳ ý thích. Bạn có thể tham khảo chi tiết trong phần help của matlab, ở đây có rất nhiều ví dụ về cách tạo ra một S-function
    Viet Nguyen
    AC2/K47-hut

    Comment


    • #3
      Con viec thiet ke bo PID nhu ban noi, ta hoan toan co the dung khoi Subsystem. Sau day la chi tiet cach lam khoi PID thuc te bang cach dung Subsystem:
      Viet Nguyen
      AC2/K47-hut

      Comment


      • #4
        Cám ơn bác nhiều!

        Em sẽ nghiên cứu cách này,nếu bác có thể thì giúp em tạo trong S-Funtion thì quá tuyệt vời.

        Comment


        • #5
          Không được rồi bác ơi

          Sao em không xem được hướng dẫn của bác vậy.Giúp em đi!

          Comment


          • #6
            Nguyên văn bởi viettuan224 Xem bài viết
            Sao em không xem được hướng dẫn của bác vậy.Giúp em đi!
            Làm với Subsystem cũng đơn giản thôi. Bác xem thử xem nha:
            Attached Files
            Viet Nguyen
            AC2/K47-hut

            Comment


            • #7
              Sau đây mình sẽ hướng dẫn bạn tạo một S-function cho bộ điều khiển PID. So sánh kết quả thu được so với cách tạo bằng subsystem.
              - Đây là mã mà mình viết cho realPID:
              Code:
              /*================================ Ham S-function mo ta dong hoc cua khau PID thuc te===========================*/
              #define S_FUNCTION_NAME realPID
              
              #define S_FUNCTION_LEVEL 2
              
              #include <math.h>
              #include "simstruc.h"
              #include "mat.h"
              
              #define U(element)          (*uPtrs[element])           // con tro toi cong vao 
              
              /*Dinh nghia cac tham so cua khoi*/
              #define Kp     mxGetPr(ssGetSFcnParam(S,0)) // tham so thu nhat
              #define Ki     mxGetPr(ssGetSFcnParam(S,1)) // tham so thu hai
              #define Kd     mxGetPr(ssGetSFcnParam(S,2)) // tham so thu ba
              #define ANFA   mxGetPr(ssGetSFcnParam(S,3)) // tham so thu tu
              
              /*khoi tao kich co cho khoi*/
              
              static void mdlInitializeSizes(SimStruct *S){
              	int ninputs=1; // be rong tin hieu cong vao
              	int noutputs=1;// be rong tin hieu cong ra
              	int nstates=2; // so trang thai lien tuc cua khoi
              	ssSetNumSFcnParams(    S, 4);  // thiet lap so tham so cho khoi
              	if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
              		return;// neu so tham so nguoi dung dua vao ma khong bang voi yeu cau thi thoat ngay
              	}
              	ssSetNumContStates(    S, nstates);  // thiet lap so trang thai lien tuc
              	ssSetNumDiscStates(    S, 0);        // thiet lap so trang thai gian doan
              	if (!ssSetNumInputPorts(S, 1)){
              		return;// neu khong thiet lap duoc so cong vao la 1 thi thoat ngay
              	}
              	ssSetInputPortWidth(S, 0, ninputs);       // thiet lap be rong tin hieu cong vao
              	ssSetInputPortDirectFeedThrough(S, 0, 1); // thiet lap trang thai co xuyen xuot
              	if (!ssSetNumOutputPorts(S, 1)){
              		return;// neu khong thiet lap duoc so cong ra la 1 thi thoat ngay
              	}
              	ssSetOutputPortWidth(S, 0, noutputs);     // thiet lap be rong tin hieu cong ra
              	ssSetNumSampleTimes(   S, 1);             // thiet lap so thoi gian trich mau
              	ssSetNumRWork(         S, 0);   /* number of real work vector elements    */
              	ssSetNumIWork(         S, 0);   /* number of integer work vector elements */
              	ssSetNumPWork(         S, 0);   /* number of pointer work vector elements */
              	ssSetNumModes(         S, 0);
              	ssSetNumNonsampledZCs( S, 0);
              
                /* Take care when specifying exception free code - see sfuntmpl.doc */
              	ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
              }
              
              /* ham khoi tao thoi gian*/
              
              static void mdlInitializeSampleTimes(SimStruct *S){
              	ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
              	ssSetOffsetTime(S, 0, 0.0);
              }
              
              /*khoi tao dieu kien ban dau*/
              
              #define MDL_INITIALIZE_CONDITIONS
              static void mdlInitializeConditions(SimStruct *S){
              	int i,nstates=2;
              	real_T *x0 = ssGetContStates(S);
              	for(i=0;i<nstates;i++){
              		x0[i] = 0;
              	}
              }
              
              /*tinh toan dau ra*/
              
              static void mdlOutputs(SimStruct *S, int tid){
              	real_T     *y=ssGetOutputPortRealSignal(S,0);
              	real_T     *x=ssGetContStates(S);
              	InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
              	double kp,ki,kd,anfa;
              	kp=Kp[0];
              	ki=Ki[0];
              	kd=Kd[0];
              	anfa=ANFA[0];
              	y[0]=ki/anfa*x[0]+(ki-kd/anfa/anfa-kp/anfa)*x[1]+(kd/anfa+kp)*U(0);
              }
              
              /*tinh dao ham*/
              
              #define MDL_DERIVATIVES
              static void mdlDerivatives(SimStruct *S){
              	real_T *dx = ssGetdX(S);
              	real_T *x = ssGetContStates(S);
              	InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
              	double anfa=ANFA[0];
              	dx[0]=x[1];
              	dx[1]= -1/anfa*x[1]+U(0);
              }
              
              /*ket thuc*/
              
              static void mdlTerminate(SimStruct *S){
              }
              
              /*ma o cuoi moi S-function luon nhu sau*/
              #ifdef MATLAB_MEX_FILE  /* Is this being compiled as a MEX-file? */
              #include "simulink.c"   /* mex-file interface mechanism */
              #else
              #include "cg_sfun.h"    /* Code generation registration func */
              #endif
              Viet Nguyen
              AC2/K47-hut

              Comment


              • #8
                Công việc tiếp theo là dịch file realPID.c ra dạng .dll
                Bước 1:
                Chọn trình biêm dịch bằng lệnh: >>mex -setup
                Khi đó matlab sẽ hiển thị ra các trình biên dịch có trong máy của bạn, chỉ cần chọn 1 trình biên dịch và bấm enter là OK
                Bước 2:
                Dịch file realPID.c ra dạng .dll bằng lệnh: >>mex realPID.c
                (lưu ý trước khi dịch bạn copy file vào thư mục work của Matlab, hoặc một thư mục bất kì nhưng phải chỉ đường dẫn thư mục đó cho matlab nhé: >>cd 'đường dẫn của thu mục')
                Bước 3:
                Sau khi dịch xong rồi ta tiến hành mô phỏng, lôi các khối cần thiết trong simulink ra nhé: subsystem,...
                Sau đây mình up lên toàn bộ quá trình làm để ai quan tâm thì theo dõi nhé:
                Attached Files
                Viet Nguyen
                AC2/K47-hut

                Comment


                • #9
                  Cảm ơn bác nhiều nghe,em sẽ cố học theo cách này.Có gì hay bác post lên cho mọi người cùng tham khảo nhé!

                  Comment


                  • #10
                    Ok nếu có gì mình làm được liên quan đến lĩnh vực này thì sẽ post lên nhé. Nhân đây mình có bài toán này cho bạn đây, bạn có thể làm nó như bước đi ban đầu trong lĩnh vực thiết kế S-Function nhé:
                    - Mô hình hoá cho bình mức một vào một ra bằng phương pháp lý thuyết
                    - có điều kiện thì kiểm chứng bằng thực nghiệm nhé
                    - tiến hành lập trình trên S-Function
                    - tiến hành mô phỏng
                    - thiết kế điều khiển
                    Gợi ý cho bạn là: đối tượng bình mức mà mình cho dưới đây có dạng hàm truyền là khâu quán tính tích phân: G(s)=K/s/(1+Ts). Khi ra được như thế này rồi thì việc lập trình là hoàn toàn đơn giản.
                    Chúc thành công!
                    Last edited by hero_ac; 09-05-2007, 18:21.
                    Viet Nguyen
                    AC2/K47-hut

                    Comment


                    • #11
                      Chào Anh hero_ac

                      Anh chỉ em cách giao tiếp với Card PCI 1711 của Avantech dùng S Function Buider đi Anh . !!!Anh giúp em với ,em đang cần gấp !!!Cảm ơn Anh nhiều !!!

                      Comment


                      • #12
                        Nguyên văn bởi viettuan224 Xem bài viết
                        Bac nao biet cach tao khoi moi trong matlab su dung S-Function Builder xin chi cho em voi. Em co bai tap :tao khoi PID trong S-Function Builder,cac bac giup em, em dang can gap lam, doi on cac bac nhieu!
                        Bạn nào muốn tìm hiểu về cách dùng S-Function thì đọc tài liệu nè nè. Rất tốt cho người mới bắt đầu làm quen với S-Function.

                        Comment


                        • #13
                          Nguyên văn bởi viettuan224 Xem bài viết
                          Bac nao biet cach tao khoi moi trong matlab su dung S-Function Builder xin chi cho em voi. Em co bai tap :tao khoi PID trong S-Function Builder,cac bac giup em, em dang can gap lam, doi on cac bac nhieu!
                          Bạn nào muốn tìm hiểu về cách dùng S-Function thì đọc tài liệu nè nè. Rất tốt cho người mới bắt đầu làm quen với S-Function.
                          MatlabTutorialPart5
                          Mình upload lên ko được. Mọi người tự down nhé Dễ lắm.Hi

                          Comment


                          • #14
                            e muốn tạo khối subsystem có bốn đầu vào KP, KI, KD và e thì làm thế nào ạ

                            Comment


                            • #15
                              chao bạn tuanbs

                              Nguyên văn bởi tuanbs Xem bài viết
                              e muốn tạo khối subsystem có bốn đầu vào KP, KI, KD và e thì làm thế nào ạ
                              cái này đơn giản
                              bước 1: tạo một model mới bằng Simulink model
                              bước 2: trong thư viện Simulink block ạn tìm khối Sussystem và input ,output kéo ra thả ngoài mạn hình -> đặt tên lại các khối
                              bước 3: copy các khối input và output đã tạo -> kích đúp vào khối Sussystem -> past vào bên trong
                              bước 4: ra ngoài khối Sussystem và nối dây vào
                              hoàn thành
                              bạn có thể tự do thiết kế tuy thích
                              có gì không hiểu cứ liên lạc với mình
                              tdquang@nippon-seiki.co.jp

                              Comment

                              Về tác giả

                              Collapse

                              viettuan224 Tìm hiểu thêm về viettuan224

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X