Xử Lý Tín Hiệu Analog, dễ như trở bàn tay

Thảo luận trong 'Siemens PLC S7-200/300/400 và S7-1200/1500' bắt đầu bởi admin, 7/4/13.

  1. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Khi mới làm quen với PLC có lẽ mọi người cũng giống mình, luôn thắc mắc làm sao để đọc tín hiệu analog đầu vào và hiển thị lên màn hình? nó sẽ xử lý ra sao, viết hàm nhứ thế nào, rồi các module vvvv nói chung là rất nhiều câu hỏi đặt ra. Có nhiều bạn thậm chí đã lập trình rồi cũng không hiểu sao nó lại như vậy, thậm chí đọc help của Siemens lại càng không hiểu khi họ cho cái hàm, ví dụ hàm scale trong S7-300 FC105 lại càng khó hiểu hơn....

    1. Tín hiệu Analog input
    Vậy nhưng nếu các bạn không cần lập trình mà chỉ cần dùng cái hàm này thì gia trị ra sẽ đúng. chỉ cần các bạn biết dùng thì không có gì là sai cả vì Siemens đã có các chuyên gia nghiêm cứu cái này rồi đó. Mình chép nguyên cái phần help cua Step 7 Manager ra đây nhé.



    Lưu ý: Ở đây mình viết cho S7-300/400 nhưng với S7-200/1200/1500 cũng làm tương tự nhé
    The SCALE function takes an integer value (IN) and converts it to a real value in engineering units scaled between a low and a high limit (LO_LIM and HI_LIM). The result is written in OUT. The SCALE function uses the equation:

    OUT = [ ((FLOAT (IN) – K1)/(K2–K1)) * (HI_LIM–LO_LIM)] + LO_LIM

    The constants K1 and K2 are set based upon whether the input value is BIPOLAR or UNIPOLAR.

    ·BIPOLAR: The input integer value is assumed to be between –27648 and 27648, therefore, K1 = –27648.0 and K2 = +27648.0

    ·UNIPOLAR: The input integer value is assumed to be between 0 and 27648, therefore, K1 = 0.0 and K2 = +27648.0

    If the input integer value is greater than K2, the output (OUT) is clamped to HI_LIM, and an error is returned. If the input integer value is less than K1, the output is clamped to LO_LIM, and an error is returned.

    Reverse scaling can be obtained by programming LO_LIM > HI_LIM. With reverse scaling, the value of the output decreases as the value of the input increases.

    Điều đặc biệt mình muốn các bạn chú ý là phần tô đậm màu xanh trong hàm trên. Đây chính là công thức mà Siemens áp dụng cho mọi module để đọc tín hiệu analoge của mình. Nếu như tín hiệu vào có đảo cực ví dụ từ -10V đến +10V ... thì set bipolar bằng 1 (tức là cho một bit nào đó bằng 1 rồi gán cho đầu vào này của FC105 là xong. Ở đây có cái hằng số K1, K2 là hằng số maximum mà module analog của Siemens có thể xử lý nên người ta đã viết cho dạng maximum.
    Như vậy chương trình có sẵn của Siemens không phải lúc nào cũng tối ưu cho nên tất cả các chương trình của mình về tính toán Analog vì độ phân giải của module không giống nhau và có thể có những ứng dụng không cẩn Scale K1,2 là 27648 do vậy mình đầu viết lại để được tối ưu hơn. Mời các bạn tham khảo chương trình sau nhé.


    "Chương trình tối ưu hóa cho tính toán Analog được viết bởi Admin của vocsy"

    Ở đây thay thế công thức của Siemens bằng công thức:

    Out=((Raw-Raw_Min)*(Scale_Max-Scale_Min))/(Raw_Max-Raw_Min) + Scale_Min

    Ở đây ta có:
    Raw: là giá trị đọc được từ đầu vào Input module
    Raw_Max: là giá trị lớn nhất module có thể đọc được hoặc là mình muốn cho nó đọc. (Ở trên Siemens nói là từ nhỏ hơn 27648 đó, chính là giá trị lớn nhất mà module analog có thể xử lý được).
    Raw_Min: Là giá trị nhỏ nhất mà module có thể đọc.
    Scale_Max: Chính là giá trị lớn nhất mà mình mong muốn thực tế hay chính là giá trị Engineering đó. Chẳng hạn đây là fias trị nhiệt độ, áp suất thực tế ....
    Scalmin: là giá trị engineering nhỏ nhất.


    Chương trình được viết dưới dạng chương trình con để thuận tiện dùng:
    // Convert from interger to Real
    L #Raw
    ITD
    DTR
    T #_Raw_R
    L #Raw_Min
    ITD
    DTR
    T #_Raw_Min_R
    L #Raw_Max
    ITD
    DTR
    T #_Raw_Max_R
    // Calculation
    // Raw - Raw_Min
    L #_Raw_R
    L #_Raw_Min_R
    -R
    T #_temp_real

    // Scale_Max - Scale_Min
    L #Scale_Max
    L #Scale_Min
    -R
    //(Raw - Raw_Min) * (Scale_Max - Scale_Min)
    L #_temp_real
    *R
    T #_temp_real

    // Raw_Max - Raw_Min
    L #_Raw_Max_R
    L #_Raw_Min_R
    -R
    T #_temp_real2
    //(Raw - Raw_Min) * (Scale_Max - Scale_Min) / (Raw_Max - Raw_Min)
    L #_temp_real
    L #_temp_real2
    /R
    //(Raw - Raw_Min) * (Scale_Max - Scale_Min) / (Raw_Max - Raw_Min) + Scale_Min
    L #Scale_Min
    +R
    T #_Output
    Đây là chương trình được rút gọn vì thực tế mình còn thêm vài cái limit cho nó nữa. Các bạn cứ tham khảo chương trình này, nếu cần liên hệ admin sẽ tận tình chỉ thêm cho.
    Chương trình cụ thể đầy đủ xem hình đính kèm.
    Và đây là hình ảnh chương trình mẹ gọi chương trình con trên thực thi
    Analog 2.
     

    Các file đính kèm:

    Bài viết mới
    Chỉnh sửa cuối: 26/9/17
  2. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    2. Tín hiệu Analoge output
    Ngược lại với module input (module analog input là mã hóa của dãy số nguyên integer maximum 27648 từ tín hiệu analog đầu vào) thì ngược lại, Đầu ra của module analog lai là tín hiệu analog từ dãy số integer maximum 27648.
    Như trên mình cũng đã nói, trong thư viện của Siemens cũng đã có sẵn hàm này rồi và các bạn chỉ cần lôi nó ra xài, đó là hàm FC106. Nếu không có gì lớn thì chịu khó đọc help của Siemens là làm được. ở đây mình cũng chép nguyên cái hướng dẫn của Siemens cho các bạn tham khảo
    The UNSCALE function takes a real input value (IN) in engineering units scaled between a low and a high limit (LO_LIM and HI_LIM) and converts it to an integer value. The result is written to OUT. The UNSCALE function uses the equation:


    OUT = [ ((IN–LO_LIM)/(HI_LIM–LO_LIM)) * (K2–K1) ] + K1

    and sets the constants K1 and K2 based upon whether the input value is BIPOLAR or UNIPOLAR.

    ·BIPOLAR: The output integer value is assumed to be between –27648 and 27648, therefore, K1 = –27648.0 and K2 = +27648.0

    ·UNIPOLAR: The output integer value is assumed to be between 0 and 27648, therefore, K1 = 0.0 and K2 = +27648.0

    If the input value is outside the LO_LIM and HI_LIM range, the output (OUT) is clamped to the nearer of either the low limit or the high limit of the specified range for its type (BIPOLAR or UNIPOLAR) and an error is returned.

    Thực ra đây cũng chính là công thức biến đổi ngược của công thức tình giá trị của analog input mà thôi. Thế nhưng mình đã nói, các bạn nên tạo một chương trình tối ưu cho ứng dụng của mình và sau đây mình cũng giới thiệu với các bạn chương trình của admin vocsy dành cho các bạn tham khảo.


    Ta cũng áp dụng công thức
    Out=((Raw-Raw_Min)*(Scale_Max-Scale_Min))/(Raw_Max-Raw_Min) + Scale_Min

    L #Scale_Min
    ITD
    DTR
    T #_Scale_Min_R
    L #Scale_Max
    ITD
    DTR
    T #_Scale_Max_R
    L #Raw
    L #Raw_Min
    -R
    T #_temp_real


    // Scale_Max - Scale_Min
    L #_Scale_Max_R
    L #_Scale_Min_R
    -R
    //(Raw - Raw_Min) * (Scale_Max - Scale_Min)
    L #_temp_real
    *R
    T #_temp_real


    // Raw_Max - Raw_Min
    L #Raw_Max
    L #Raw_Min
    -R
    T #_temp_real2
    //(Raw - Raw_Min) * (Scale_Max - Scale_Min) / (Raw_Max - Raw_Min)
    L #_temp_real
    L #_temp_real2
    /R
    //(Raw - Raw_Min) * (Scale_Max - Scale_Min) / (Raw_Max - Raw_Min) + Scale_Min
    L #_Scale_Min_R
    +R
    T #_Output
    //Convert scaled output to integer
    L #_Scaled_R
    RND
    T #Scaled


    Và đây là chương trình gọi thực tế để các bạn tham khảo
    out.
    Đến đây các bạn nếu tinh ý sẽ thấy hai chương trình sao mà giống nhau thế. Admin sẽ không tiết lộ bí mất này ra mà để mọi người cungd suy nghĩ thêm nhé. Nếu có ai không hiều và muốn biết bí mật đó là gì thì admin sẽ bật mí sao vài tuần nữa. :D
     
    Chỉnh sửa cuối: 26/9/17
    hoan hoan, lephiho, thanhtuan and 6 others like this.
  3. josephtranhuan

    josephtranhuan New Member

    Tham gia ngày:
    10/4/13
    Bài viết:
    16
    Đã được thích:
    9
    Điểm thành tích:
    3
    Giới tính:
    Nam
    Cũng giống với công thức A_in = ((A_max - A_min)*(D_out - D_min)) / (D_max - D_min) + A_min.
    Anh ơi, Sao giá trị Raw_min lại bằng -16384 và Raw_max = 16384 và Scale_min lại = -1.500000e + 003 và Scale_max = 1.500000e + 003 vậy anh?
     
    QUANGVO, mrmanhtran.mt and admin like this.
  4. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Chào em
    Thứ nhất công thức nào thì chân lý vẫn chỉ có một và là duy nhất nếu nó là chân lý. Cho nên chẳng qua mõi người triển khai một cách khác nhau mà thôi.
    Thứ hai là trong bài trên anh nói rất rõ ràng, không phải module nào cũng là 27648 và không phải lúc nào cũng dùng cái giá trị này. Tùy từng ứng dụng cụ thể cho nên khi anh làm việc mới viết chương trình này để tối ưu hóa cho công việc của anh. Cái hàm trên em thấy anh đang dùng để đổi tần số tính toán từ feedback encoder đọc về của motor. cái motor drive (Biến tần) nó đâu có hiểu 50Hz là cái gì đâu, nhưng nếu mình chỉ cho nó là tao muốn mày chạy maximum vận tốc và mình cài cho biến tần maximum vận tốc của cái motor là 50Hz, vậy là cu cậu sẽ chạy 50Hz và mình có được vận tốc mong muốn nhưng nó sẽ chạy với con số là 1500 đó mà. Khi em đi làm sẽ còn nhiều vấn đề hơn nữa. Để bữa nào anh cho môt ví dụ hác mà anh làm thực tế sẽ thú vị hơn nhiều. :D
     
  5. josephtranhuan

    josephtranhuan New Member

    Tham gia ngày:
    10/4/13
    Bài viết:
    16
    Đã được thích:
    9
    Điểm thành tích:
    3
    Giới tính:
    Nam
    Dạ, em không có ý nói là anh copy chứ không phải anh viết mà do lối em diễn tả không được chuẩn nên anh hiểu nhầm ý em nói.hi Lý thuyết áp dụng vào thực tế khó lắm, như bọn em làm mỗi mô hình ti ti mà hì hục mãi. Cảm ơn vì bài viết và lời chia sẻ của anh ạ.
     
    mrmanhtran.mt and admin like this.
  6. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Chào em
    Không sao đâu, anh cũng không có ý giận em. Anh chỉ muốn em hiểu là khi đi làm sẽ cần có nhiều thứ hơn những gì em được học trong trường. Em cứ liên hệ anh nếu em gặp khó khăn gì mà anh có thể giúp được.
     
  7. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Thông báo là ad đã hoàn thành công tác ở Nga và đã trở về VN. Đây là dây chuyền mà Ad đã hoàn thiện phần commissioning.

     
    Chỉnh sửa cuối: 25/2/16
    hoanghuy, binh1133, vinh1008 and 11 others like this.
  8. ngongpro27

    ngongpro27 New Member

    Tham gia ngày:
    18/3/13
    Bài viết:
    21
    Đã được thích:
    9
    Điểm thành tích:
    3
    Giới tính:
    Nam
    Xin chúc mừng Admin !:)
     
    hoan hoan and admin like this.
  9. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Mình đã viết một ví dụ về ứng dụng bài toán Analog dùng Distance Laser Sensor của Baumer. Các bạn có thể đọc thêm vài viết này để hiểu thêm về các xử lý tín hiệu Analog.
    Tóm tắt ý của bạn "trando" trong chủ đề (Thực ra chủ đề của bạn ấy gặp vấn đề nhưng mình chỉ muốn nhấn mạnh ví dụ để đo khoảng cách và xử láy tín hiệu Analog mà thôi), đề tài bạn "trando" là muốn đo khảng cách của một Piston có hành trình max stroke là 500mm, nếu chỉ để đo khảng cách và biết được vị trí của Piston thì chọn một sensor có thể đo được độ dài là bằng hoặc lớn hơn khảng cách cần đo.
    Các bạn đọc và hiểu thêm về sử lý tín hiểu Analog nhé.
    to @Hãy đăng nhập hoặc đăng ký để xem được links trong bài này cũng giúp bạn hiểu thêm về Engineering Unit và các gía trị max scale, min scale nhé.

    Hãy đăng nhập hoặc đăng ký để xem được links
     
  10. t.phuong919

    t.phuong919 New Member

    Tham gia ngày:
    6/6/13
    Bài viết:
    7
    Đã được thích:
    1
    Điểm thành tích:
    1
    Giới tính:
    Nam
    a nào chỉ giúp e bài này với ,e chưa viết chương trinh con bao giờ cả,các a có thể chỉ giúp e bài này dc ko ah !
    "1 bình trộn có khả năng chứa tối đa 300l được thiết kế 2 van điện từ để đóng mở cung cấp nguyên liệu,1 dong co khuấy,1 van dien từ đóng mở để xả hổn hợp và 1 cảm biến chuyển đổi đo mức ở giá trị 10v khi mức đạt giá trị tối đa đc dk bằng t.bị lập trình plc s7-300.sử dụng khối FC105 chuyển giá trị analog này thanh đại lượng vật lý (số lít ).hay viet 1 doan chuong trinh đkk nếu mức hỗn hợp xuống thấp hơn giá trị 50lit thì đầu ra sẽ có đèn sáng cho đến khi đạt 50lit "
    cho e hỏi thêm nếu cũng bài này mà viết trên khối FC1 thì có j khác nhau ko ah ?
    e cam on mọi người !hihi
     
  11. Lê Tí

    Lê Tí Administrator

    Tham gia ngày:
    6/5/13
    Bài viết:
    172
    Đã được thích:
    129
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nơi ở:
    Haidöng, Hải Dương, Vietnam
    Web:
    em mô phỏng khối FC 105 và FC 106 sử dụng PIW và PQW khi down xuống SIM thì khỏi chạy lun ~.~ không hiểu máy tính bị khùng không nữa, bác nào biết lõi này chỉ em với
     
  12. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Gửi cái chương trình đây anh kiểm tra cho, em có thể test một chương trình khác, nếu chương trình vẫn không chạy thì cài lại PLCSIM hoặc có thể là cả Step manager nữa.
    Nên nhớ khi viết chương trình đừng quên hai khối hàm quan trọng OB121, OB122 nhé.
     
  13. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Em là @sinh đó hả, nếu đúng thì không nên viết trong nhiều thread nhé, vì vi phạm như vậy sẽ được coi là spam đó và sẽ bị xoa vĩnh viễn.
     
    mrmanhtran.mt thích bài này.
  14. t.phuong919

    t.phuong919 New Member

    Tham gia ngày:
    6/6/13
    Bài viết:
    7
    Đã được thích:
    1
    Điểm thành tích:
    1
    Giới tính:
    Nam
    ý a nói e là j cơ ?đây là lần đầu e tham gia dien đàn ,e ko biết ,cho e xl .
    e cung mới nghịch đến chuong trinh con ,e doc và thu viết tren pm PLC thấy rất khó với khả năng của e.Nếu như a ad có tài liệu hay 1 vài vi dụ cụ thế về cách chuyển đổi tin hiệu analog đầu vào dùng ngon ngữ LAD thì a co the gui cho e theo dia chi " t.phuong919@gmail.com "de e tham khao về cách viết dc chứ ah
     
  15. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Sao mà hai người làm chung đề tài hả, không sao cả, cách viết thì trong bài này anh đã viết rồi đấy thôi. Tài liệu thì em đọc ở đây, đây là tài liệu đào tạo của Siemens hồi anh còn làm cho Siemens đó Hãy đăng nhập hoặc đăng ký để xem được links
     
  16. Lê Tí

    Lê Tí Administrator

    Tham gia ngày:
    6/5/13
    Bài viết:
    172
    Đã được thích:
    129
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nơi ở:
    Haidöng, Hải Dương, Vietnam
    Web:
    em viết chương trình ví dụ đơn giản như thế này, xong mô phỏng trên sim thì lỗi khỏi tác động luôn, mà các ví dụ khác vẫn làm bình thường
     

    Các file đính kèm:

    mrmanhtran.mt and t.phuong919 like this.
  17. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Archive cái chương trình đang test bị lỗi đó gửi vào email cho anh thì anh mới kiểm tra được.
     
    mrmanhtran.mt and t.phuong919 like this.
  18. t.phuong919

    t.phuong919 New Member

    Tham gia ngày:
    6/6/13
    Bài viết:
    7
    Đã được thích:
    1
    Điểm thành tích:
    1
    Giới tính:
    Nam
    e cảm ơn anh nhé,e mới tim hiểu nên e rất can tai liệu .!
     
    hoan hoan thích bài này.
  19. admin

    admin Chia sẻ để cùng phát triển Thành viên BQT

    Tham gia ngày:
    15/1/13
    Bài viết:
    3,467
    Đã được thích:
    2,561
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Automation Engineer
    Nơi ở:
    Sài Gòn
    Web:
    Hãy nhấn nút thích thay vì nói cảm ơn nha bạn
     
  20. t.phuong919

    t.phuong919 New Member

    Tham gia ngày:
    6/6/13
    Bài viết:
    7
    Đã được thích:
    1
    Điểm thành tích:
    1
    Giới tính:
    Nam
    Ad ơi, có thể hướng dẫn cho em cách mô phỏng khối fc 105 trên plcsim ntn không ạ, em viết chương trình rồi mà không biết mô phỏng ntn, chương trình bình thường thì em biết, còn về khối 105 em chưa làm bao giờ, ad giúp em nhé
    thank anh nhiều ạ
     

Chia sẻ trang này