BeeLab: Tự động hóa
Showing posts with label Tự động hóa. Show all posts
Showing posts with label Tự động hóa. Show all posts

Monday, October 24, 2016

[Arduino ] Làm thế nào để biến Arduino thành PLC ?

12:00:00 AM
[Arduino ] Làm thế nào để biến Arduino thành PLC ?
Nếu các bạn có học hoặc làm về lĩnh vực có liên quan tới tự động hóa hẳn sẽ không xa lạ gì với từ PLC, một thiết bị được ứng dụng rộng rãi trong công nghiệp nhưng giá thành cao. Việc tiếp cận với những bộ PLC này đối với sinh viên thường chỉ được sử dụng ở trên phòng thí nghiệm là chính, nếu muốn tìm hiểu sâu hơn như làm ra một bộ PLC made in VN hoặc biến đổi một board nào có sẵn thành PLC thì cần làm như thế nào ? Bài viết này sẽ cung cấp cho các bạn một số kiến thức cơ bản ban đầu để thực hiện điều đó, mình sẽ chủ yếu tập trung đi vào phần mềm để tạo ra cách lập trình giống như ngôn ngữ ladder thường dùng trong PLC.
Để hô biến Arduino thành PLC ta sẽ có 2 cách:
  • Đầu tiên là viết chương trình dùng LDmicro (sử dụng ngôn ngữ ladder) sau đó dùng Web chuyển đổi code cho thư viện ladder.h
  • Cách 2 là sử dụng plcLIB.

LDmicro

ldmicro
Trước tiên ta phải tải LDmicro về trước, sau đó giải nén mở nó lên như bao chương trình khác ta sẽ có giao diện như sau
ldmicro_intro1
Chương trình rất dễ sử dụng, bạn chỉ cần vào mục Instruction sẽ thấy các lệnh giống như PLC để có thể thêm vào. Chúng ta thử đi vào một ví dụ đơn giản cụ thể là ấn nút điều khiển LED để mọi người có thể hình dung được rõ hơn
Trên màn hình của LDmicro ta chọn Instruction-> Insert contact hoặc ấn phím tắt là “C”, click đôi chuột vào biểu tượng xnew để đổi tên thành Button là ta đã có một nút nhấn, tiếp theo với LED thì chọn Instruction-> Insert coil hoặc ấn phím tắt là “L”, đổi tên cho Ynew thành LED, ta sẽ có kết quả như hình


led_ldmicro
Tiếp theo ta chọn Settings-> Microcontroller -> ANSI C Code để sinh code, sau đó chọn Complie -> Complie as như hình


settingldmicro
complier_ldmicro
Chọn lưu lại tại desktop với

  • Save as: All Files
  • Filename: ladder.cpp
Tiếp tục chọn File -> Save as và lưu lại LDmicro project với tên là ladder.ld để lưu trữ và sửa chữa về sau
Sau đó mở file ladder.cpp bằng notepad hoặc bất kỳ chương trình nào có thể xem được file này, copy toàn bộ và paste vào web, sau đó chọn generate để tạo ra file ladder.h sau đó copy toàn bộ code ở ô màu vàng vào notepad và lưu lại dưới dạng

  • Save as: All Files
  • Filename: ladder.h
result_ladder
Hiện tại mới chỉ có bộ khung, còn chân cẳng như thế nào thì chưa được cấu hình, do đó chúng ta cần chỉnh sửa file ladder.h một chút
Ở đây chúng ta sử dụng chân 12 kết nối với nút nhấn, chân 13 sẽ kết nối với LED có sẵn trên board.

pinMode(12, INPUT);
pinMode(13, OUTPUT);


Code ladder.h sau khi chỉnh sửa sẽ có dạng như sau

#ifndef LADDER_H
#define LADDER_H

#if ARDUINO >= 100
    #include "Arduino.h"  
#else
    #include "WProgram.h"
#endif

#define BOOL boolean
#define SWORD int

#define EXTERN_EVERYTHING
#define NO_PROTOTYPES

void PlcCycle(void);

/* Configure digital I/O according to LD (call this in setup()). */

inline void PlcSetup()
{
 pinMode(12, INPUT);
 pinMode(13, OUTPUT);
}


/* Individual pins (this code is used in ladder.cpp) */

inline extern BOOL Read_U_b_XButton(void)
{
    // TODO
 return digitalRead(12);

}

inline BOOL Read_U_b_YLED(void)
{
    // TODO
 return digitalRead(13);
}

inline void Write_U_b_YLED(BOOL v)
{
    // TODO
 digitalWrite(13,v);
}


#endif

Việc tiếp theo sẽ là tạo ra một file “pinmap.ini”, trong file này sẽ là mô tả tên biến tương ứng với chân của Arduino


; This file contains mapping between variable name in the LD and actual
; pin number of the Arduino.
 
; Button on pin 12
Button = 12
 
; LED on pin 13
LED = 13
Complie và nạp thử xuống arduino xem sao. Nếu hiện thông báo Done compiling hoặc Done uploading là thành công rồi. Giờ thì Arduino của bạn đã giống với 1 bộ PLC rồi đấy.
Lưu ý: Việc tạo project mới và các file có liên quan luôn phải có tên là ladder, nếu muốn sử dụng thì phải xóa bỏ hoặc backup lại thư mục ladder cũ rồi chép thư mục ladder mới vào đúng đường dẫn của Arduino.
Nhìn thì có vẻ hơi phức tạp, nhưng thực ra lại đỡ được rất nhiều công đoạn bên dưới, chúng ta chỉ cần quan tâm tới lập trình ladder, sau đó cấu hình lại một chút chân cẳng, còn lại thì đã có Arduino lo, tuy nhiên không vì thế mà phủ nhận việc phải có một chút kiến thức cơ bản để biết cách cấu hình chân IO cho Arduino
Nếu muốn tốt hơn thì ta có thể chỉnh sửa lại code để quá trình sinh code, copy, chuyển code, lưu file thành một quá trình tự động thì sẽ tốt hơn rất nhiều, người lập trình chỉ việc lập trình ladder, ấn nút sinh code sẽ có chương trình để nạp vào arduino, một ý tưởng không tồi phải ko các bạn?

Tất cả những file cần thiết đã xong, giờ thì chúng ta đưa 4 file ”ladder.ld” , ”ladder.cpp” , ”ladder.h” , ”pinmap.ini” vào trong một thư mục với tên “ladder”, sau đó di chuyển thư mục này tới C:\Program Files (x86)\Arduino\libraries (ở đây mình dùng win10-64bit các bạn nên thay bằng thư mục tương ứng của máy mình).
Sau đó mở Arduino lên, chọn Sketch->Include library->ladder, điều chỉnh code như hình
arduino_ladder_check

plcLIB

Khi nói đến plcLIB chắc mình phải thốt lên rằng “Ơn giời cậu đây rồi”, ở phương án sử dụng LDMicro thì qua nhiều bước nhiêu khê bao nhiêu thì với plcLIB có thể thuận lợi hơn được bất nhiêu. Chỉ việc copy đưa vào thư mục library của Arduino sau đó sử dụng.
Với việc cấu hình chân cẳng, hiện tại plcLIB đã thực hiện hết cho chúng ta, việc còn lại chỉ là đọc và xem người ta cấu hình chân nào làm chức năng nào, tiếp theo là có rất nhiều các ví dụ để sử dụng và tham khảo như IO, bàn phím, điều khiển động cơ, delay, các phép toán AND, OR…. Dưới đây là một ví dụ minh họa



#include <plcLib.h>


/* Programmable Logic Controller Library for the Arduino and Compatibles

   PWM (Pulse Width Modulation) - Analogue control of a PWM output

   Connections:

   Input - potentiometer connected to input X0 (Arduino pin A0 / Tinkerkit pin I0)

   Output - LED connected to output Y0 (Arduino pin 3 / Tinkerkit O5)


   Software and Documentation:

   http://www.electronics-micros.com/software-hardware/plclib-arduino/

*/



void setup() {

  setupPLC();      // Setup inputs and outputs

}



void loop() {

  inAnalog(X0);    // Read Analogue Input 0

  outPWM(Y0);      // Send to Output 0 as PWM waveform

}
Bạn có thể tải project của LDMicro và thư viện plcLIB tại plcLib+LDMicro

Thursday, June 9, 2016

Phát xung (PTO - PWM) trong PLC Siemens

1:10:00 AM
Phát xung (PTO - PWM) trong PLC Siemens

Tóm tắt:
Sử dụng wizard sẽ làm cho người lập trình đỡ tốn công lập trình hơn (chủ yếu cài thông số cho phù hợp -> tạo ra hàm -> lôi ra sử dụng trong chương trình chính)

1. Chế độ PWM thì đơn giản, chỉ cần khai báo thông số chu kỳ và độ rộng xung
2. Chế độ PTO thì có nhiều thứ hơn (hay dùng điều khiển động cơ bước và servo), nói sơ ở phần cơ bản nha:
có các thông số sau:
- tốc độ max (mặc định là 100KHz)
- tốc độ min (mặc định là 5kHz)
- thời gian tăng tốc (mặc định 1s)
- thời gian giảm tốc (mặc định 1s)

trong chương trình chính có 2 cách sử dụng:
PTO_CTRL: chương trình luôn luôn thực hiện việc phát xung (nếu ko phát sinh lỗi hoặc có tác động stop của chương trình -> dừng khẩn cấp I-STOP hoặc dừng có giảm tốc D-STOP)
PTO_MAN: việc phát xung tùy thuộc vào điều kiện RUN của hàm

Chương trình tại đây!

I. GIỚI THIỆU:
    Trong PLC S7-200 có hổ trợ chúng ta phát xung tốc độ cao (tức là tạo một chuỗi xung ngỏ ra) tại 2 chân Q0.0 và Q0.1
    Ta dùng instruction PLS để thực hiện phát xung trên PLC S7-200. Chú ý rằng instruction này được chia ra 2 chức năng là phát xung PTO và điều rộng xung PWM
       - PTO (Pulse Train Output) là 1 chuỗi xung ngỏ ra với độ rộng xung ON là 50% của chu kì
       - PWM (Pulse Width Modulation) là 1 chuỗi xung ngỏ ra mà ta có thể thay đổi được độ rông xung ON
    Vậy ta thấy rằng PTO chẳng qua chỉ là 1 trường hợp đặc biệt của PWM mà thôi.
    Khi ta sử dụng chức năng phát xung tại các chân Q0.0 và Q0.1 thì các lệnh xử lý tại các chân này đều được bỏ qua và chú ý rằng trước khi sử dụng phát xung trên       2 chân này ta phải reset chúng về 0 trước




    Khi ta sử dụng cũng như thiết kế phát xung tốc độ cao trong PLC S7-200 sẽ có 1 vùng nhớ đặc biệt SM để điều khiển chúng gồm 1 thanh ghi 8 bit cho điều khiển, 1       thanh ghi 32 bit không dấu dành cho giá trị xung đếm, 1 thanh ghi không dấu 16 bit cho thời gian 1 chu kì và 1 thanh ghi 16 bit không dấu cho độ rộng xung

II. ĐIỀU RỘNG XUNG PWM TRONG PLC S7-200:
     Ta có thể chọn đơn vị thời gian cho cycle time (base time) của PWM là ms hoặc us bởi các bit điều khiển. giới hạn thời gian 1 chu kì cycle time như sau:
      - 50 µs to 65,535 µs (nếu đơn vị thời gian chọn là us)

      - 2 ms to 65,535 ms (nếu đơn vị thời gian chọn là ms)
    Trong 1 số trường hợp đặc biệt như độ rộng xung mà bằng 100% thời gian của 1 chu kì (cycle time) thì ngỏ ra sẽ output liên tục cũng như nếu độ rộng xung bằng         0% thời gian của 1 chu kì thì ngỏ ra sẽ OFF.
    Nếu trong chương trình độ rộng xung mà >= giá trị của cycle time thì PLC sẽ hiểu là độ rộng bằng 100% cycle time
    Nếu trong chương trình độ rộng xung mà =0 thì PLC sẽ hiểu là ngỏ ra OFF
    Nếu trong chương trình chọn cycle time < 2 lần đơn vị base time thì PLC sẽ hiểu là cycle time = 2 lần đơn vị base time

    Có 2 cách để thay đổi đặc tính sóng ngỏ ra trong PWM của PLC S7-200:
        - Synchronous Update: Siemens nói rằng nếu trong chương trình của chúng ta không cần thay đổi đơn vị thời gian time base thì chọn phương pháp điều rộng xung đồng bộ. Việc thay đổi đặc tính sóng ngỏ ra tại vùng biên của 1 chu kì khi mà đơn vị thời gian time base không thay đổi vẫn đảm bảo sóng ngỏ ra mịn và ổn định
        - Asynchronous Update: Trong 1 số trường hợp ta cần thay đổi đơn vị thời gian time base trong chương trình thì cần phải chọn phương pháp điều rộng xung bất đồng bộ. Trong chế độ này bộ phát xung của chúng ta sẽ ngừng hoạt động trong giây lát mỗi khi đặc tính sóng ngỏ ra thay đổi, chính vì vậy nên sóng ngỏ ra cũng sẽ không đồng bộ và điều này dẫn đến hiện tượng gọi là rung pha.
     *** Siemens khuyến cáo chúng ta nên chọn chế độ Synchronous Update trong PWM của PLC S7-200. Chọn chế độ này như thế nào sẽ được đề cập phần sau nhé



III. CÁC BIT CẤU HÌNH VÀ ĐIỂU KHIỂN TRONG PWM CỦA PLC S7-200:
     Trong bài hôm trước về phát xung PTO chúng ta đã tìm hiểu các bit điều khiển trong phát xung PTO, hôm nay ta chỉ tìm hiểu các bit điều khiển trong PWM mà thôi        nên những bit liên quan đên PTO ta sẽ không đề cập đến nữa




      - Byte điều khiển SMB66 và SMB76 chỉ dùng cho cấu hình PTO nên tham khảo bài PTO nhé
      - SM67.0 & SM77.0 : Nếu trong chương trình ta muốn thay đổi thời gian 1 chu kì cycle time thì hãy set bit này lên 1
      - SM67.1 & SM77.1 : Ta phải set bit này lên 1 để thay đổi độ rộng xung (thời gian của xung ON trong 1 chu kì được gọi là độ rộng xung)
      - SM67.2 & SM77.2 : Dùng cho cấu hình PTO 
      - SM67.3 & SM77.3 : Chọn đơn vị thời gian time base (nếu là 0 thì us và nếu chọn là 1 thì ms)
      - SM67.4 & SM77.4 : Chọn bằng 1 thì phương pháp PWM là đồng bộ (synchronous update) và chọn bằng 0 thì phương pháp PWM là bất đồng bộ (asynchronous)
      - SM67.5 & SM77.5 : Dùng cho cấu hình PTO 
      - SM67.6 & SM77.6 : Set bằng 1 để dùng chế độ điều rộng xung PWM trên chân Q0.0 hoặc Q0.1
      - SM67.7 & SM77.7 : Set bằng 1 để cho phép module phát xung hoạt động
      - SMW67 & SMW78: Thanh ghi 16 bit để load giá trị cycle time 
      - SMW70 & SMW80: Thanh ghi 16 bit để load giá trị độ rộng xung 
      - SMD72 &SMD82: Dùng cho cấu hình PTO
      - SMB166 & SMB176: Dùng cho cấu hình PTO
      - SMW168 & SMW 178 : Dùng cho cấu hình PTO
      Ta có thể tham khảo 1 số giá trị điều khiển mẫu thường sử dụng trong bảng sau:



     Ví dụ ta load giá trị 16#D1 (11010001) vào thanh ghi điều khiển SMB67 thì có nghĩa là ta chọn phát xung trên chân Q0.0 của PLC. Chế độ phát xung là PWM,                phương pháp PWM là đồng bộ synchronous (tức là không thay đổi base time trong chương trình), đơn vị thời gian time base là us, cho phép thay đổi thời gian 1 chu      kì cycle time và không cho phép thay đổi độ rộng xung.



IV. LẬP TRÌNH ĐIỀU RỘNG XUNG PWM TRONG PLC S7-200:
     Ta chỉ sử dụng 1 instruction PLS khi muốn phát xung PWM trong PLC S7-200. Nếu muốn phát xung trên chân Q0.0 thì thông số Q0.X =0 và chân Q0.1 thì chọn là 1
    


     Khuyến cáo: Ta nên sử dụng bit SM0.1 để gọi chương trình con và trong chương trình con ta sẽ cấu hình cho PWM, làm như vậy sẽ giảm được thời gian scan time      cho PLC giúp tối ưu hóa lập trình hơn.
     Sau đó trong chương trình con ta thực hiện các bước sau để cấu hình cho PWM:
        B1: load giá trị phù hợp vào thanh ghi điều khiển
        B2: load giá trị cycle time
        B3: load giá trị độ rộng xung 
        B4: thực hiện gọi instruction PLS để bắt đầu phát xung
        B5: nếu trong chương trình tiếp theo sau ta cần thay đổi các thông số như cycle time hay độ rộng xung thì ta load giá trị phù hợp vào thanh ghi điều khiển trước             khi thoát khỏi chương trình con

    Để thay đổi giá trị độ rộng xung cho PWM ta thực hiện gọi 1 chương trình con khác, trong chương trình con đó thực hiện các bước sau:
        B1: Nếu bước 5 ở trên đã được thực hiện thì ở đây ta chỉ cần load giá trị độ rộng xung mới
        B2: Thực hiện gọi instruction PLS để bắt đầu phát chuỗi xung mới
        B3: Nếu trong chương trình tiếp theo sau ta cần thay đổi các thông số như cycle time hay độ rộng xung thì ta load giá trị phù hợp vào thanh ghi điều khiển trước             khi thoát khỏi chương trình con.

V. VÍ DỤ CỤ THỂ:
     Như đã đề cập ở trên trước khi sử dụng phát xung ta phải reset chân phát xung và dùng bit SM0.1 để gọi chương trình con khởi tạo PWM. Vậy trong chương trình        chính ta có Network 1 là reset chân Q0.1 và gọi chương trình con SBR_0. 
     Trong network 2 dùng xung cạnh lên của bit điều khiển M0.0 để gọi chương trình con SBR_1


      Trong chương trình con SBR_0 thực hiện các lệnh sau:
         - Load giá trị DB(11011011) vào thanh ghi điều khiển SMB77 (Ở đây ta dùng chân Q0.1 để phát xung nên dùng thanh ghi SMB77 nhé)
              + chọn chế độ phát xung PWM
              + chọn đơn vị thời gian base time là ms
              + chọn phương pháp PWM là đồng bộ (synchronous update)
              + cho phép thay đổi độ rộng xung cũng như cycle time trong chương trình
      Load giá trị 10.000 vào thanh ghi SMW78 để chọn thời gian của 1 chu kì là 10s
      Load giá trị 1.000 vào thanh ghi SMW80 để chọn độ rộng xung là 1s
      Gọi instruction PLS để bắt đầu phát xung trên chân Q0.1
      Vì trong chương trình ta giả sử cần thay đổi độ rộng xung trong chuỗi xung tiếp theo nên ta phải load giá trị phù hợp vào thanh ghi điều khiển SMB77 trước khi               thoát khỏi chương trình con SBR_0 (Ở đây ta load giá trị là DA (11011010) tức là chỉ muốn thay đổi độ rộng xung chứ không thay đổi cycle time)


     Vậy sau khi PLC thực thi xong chương trình con SBR_0 thì xung ngỏ ra tại chân Q0.1 sẽ xuất hiện với độ rộng xung là 1s trên tổng chu kì 10s. Xung cứ phát ra như thế cho đến khi bit điều khiển M0.0 set lên 1 thì PLC thực hiện lệnh gọi chương trình con SBR_1
    Trong chương trình con SBR_1 thực hiện thay đổi độ rộng xung như sau:
    Load giá trị 5000 vào thanh ghi SMW80 để thay đổi độ rộng xung là 5s
    Gọi instruction PLS để thực hiện áp dụng thay đổi. Nếu không muốn thay đổi đặc tính sóng ngỏ ra nữa thì ta không cần phải load giá trị vào thanh ghi điều khiển nữa


   Vậy cuối cùng thực hiện xong chương trình con SBR_0 thì chân Q0.1 sẽ phát xung với độ rộng xung là 5s trên tổng chu kì là 10s. Và xung cứ phát ra như thế tiên tục
   Cụ thể hình sau cho ta dạng sóng ngỏ ra theo thời gian của chân Q0.1 với đoạn code trên
   

Xử lý tín hiệu Analog trong PLC Siemen S7-200

12:01:00 AM
Xử lý tín hiệu Analog trong PLC Siemen S7-200
Đặt vấn đề: để hiểu rõ về analog ta cần giải quyết một ví dụ cụ thể như sau
Đo mức nước có dãi đo từ 0m-40m. Tín hiệu cảm biến truyền về là 4-20mA.

Giải:
Như vậy với:
O: output
s: sensor
v: value

Ta có:
Ov ---------đầu ra   ===> 0m ===> 40m
Iv   ---------đầu vào ==> 4mA ===> 20mA

Lưu ý, S7200 có module đọc analog có độ phân giải từ 6400 đến 32000, nghĩa là 4mA đọc vào thì trong PLC hiểu là 6400 đơn vị và 20mA đọc về là 32000 đơn vị.
Như vậy ta có thể lặp được 1 đường thẳng qua 2 điểm. Và xây dung phương trình đường thẳng qua 2 điểm đó có dạng Y = aX + b

Osvmax  -----   đầu ra max   -----   40m  
Osvmin   -----   đầu ra in       -----   0m 

Isvmax  -----   đầu vào max   -----   32000 
Isvmin   -----   đầu vào in       -----   6400 

Công thức để tính cho tín hiệu Analog sẽ là:

Ov=[(Osvmax -Osvmin)(Iv-Isvmin)/(Isvmax-Isvmin)]+Osvmin

=> Ov =[(40 -0)(Iv-6400)/(32000-6400)]+0
=> Ov = 0.0015625Iv - 10
Ta có được phương trình. bây giờ xây dựng phương trình vào PLC

Hàm I_DI chuyển vùng nhớ AIW0 16bit chuyen sang vung nho VD100 32bit
Ham DI_R chuyen vung nho VD100 32bit chuyen sang vung nhớ số thực VD104 32bit (dấu phẩy động)
Sau khi lấy được giá trị thưc có dấu phẩy động rồi ta đưa vào công thức tính.

Khối MUL_R là khối NHÂN 2 số thực
Khối SUB_R là khối TRỪ 2 số thực



Như vậy sau một loạt hàm chuyển đổi và khối tính toán thì từ đầu vào giá trị cảm biến AIW0 và kết quả PLC xử lý analog được là VD112

Bổ sung:
Có thể xây dung hàm tổng quát để xử lý tín hiệu Analog như sau




Các bạn liên hệ tác giả để được hướng dẫn chi tiết hơn !

Wednesday, June 8, 2016

Lập trình PLC Delta điều khiển Servo bằng lệnh phát xung - Ứng dụng PLC Delta, Servo Delta trong công nghiệp chế tạo máy.

5:40:00 PM
Lập trình PLC Delta điều khiển Servo bằng lệnh phát xung - Ứng dụng PLC Delta, Servo Delta trong công nghiệp chế tạo máy.
Mở đầu: 
- Sau khi làm quen với PLC và Servo, lập trình viên có thể tìm hiểu thêm về điều khiển phát xung để điều khiển Servo ở chế độ điều khiển vị trí. Ứng dụng trong các máy cắt bao bì, máy đóng gói, máy phóng nguyên liệu, ...
- Với Servo, sẽ có tham số cho phép cài đặt hiệu chỉnh số xung / 1 vòng quay.
- PLC sẽ có lệnh phát xung với các tham số về tần số phát xung, số xung phát ra.
Vấn đề điều khiển:
- Cài đặt Servo ở chế độ điều khiển vị trí: khi đó với mỗi 1 vòng quay của Motor, bộ điều khiển - Drive của Servo sẽ quy thành số xung. Ví dụ là 160.000 xung/vòng quay. Điều này có nghĩa : PLC phát đủ 160.000 xung thì động cơ Servo sẽ quay được đúng 1 vòng. Ở bài viết này, tôi chưa đề cập tới độ phân giải tức là số xung của Encoder được gắn trên động cơ.
- Về tốc độ: tốc độ động cơ ở chế độ điều khiển vị trí sẽ được tính tương đương với tần số phát xung của PLC. Chúng ta có thể dựa vào tần số + số xung/ vòng để quy ngược lại thành tốc độ vòng/ phút của Motor, xem chi tiết cách tính bên dưới.
Vấn đề lập trình PLC:
- Lệnh điều khiển phát xung:

  
+ Trong hình trên: 
P1 là chương trình con P1 tên do người lập trình đặt là AC Servo
M1000 là bit luôn ON khi PLC RUN - dùng để tạo điều kiện đầu vào cho câu lệnh, tránh trường hợp vô điều kiện.
M13 là bit Rơ le phụ trong chương trình và được người lập trình đặt cho phép thực hiện lệnh phát xung.
M10 là bit Rơ le phụ trong chương trình và được người lập trình đặt cho phép chạy chế độ phát xung liên tục, không giới hạn số xung. ( Phát đủ xung, chương trình sẽ khởi tạo lại bit M10 để lệnh phát xung nhận lần tiếp theo ).
M1029 là bit Rơ le trạng thái trong chương trình và được PLC tự động ON khi lệnh phát xung phát đủ số xung đã yêu cầu ( Trong chế độ phát xung có giới hạn) và không ON khi chạy liên tục.
M12 là bit Rơ le phụ trong chương trình và được người lập trình đặt cho chế độ tự động.

Ở ví dụ lập trình trên, chúng ta chỉ quan tâm tới lệnh phát xung và bit báo trạng thái phát xung hoàn thành.
+ Cách viết lệnh phát xung:
Trong cửa số soạn thảo chương trình theo dạng Ladder, người lập trình chỉ cần gõ trực tiếp câu lệnh : 
             DPLSY D500 D510 Y0



+ Với ví dụ này: 
·   Cấu trúc lệnh phát xung DPLSY bao gồm:
chữ D nghĩa là dạng Double, các thanh ghi dữ liệu được sử dụng sẽ ghép đôi trở thành thanh ghi lớn hơn.
Ví dụ trên: D500 là thanh ghi 16 bit với PLC Delta, khi dùng trong câu lệnh có Double sẽ được ghép chung với 1 thanh ghi phía sau là D501 trở thành thanh ghi 32 bit. Khi đó D501 và D500 sẽ trở thành 1 thanh ghi và được chia làm 2 phần chứa trong D501 và D500 dưới dạng byte thấp và byte cao.
·  Chữ PLSY là ký hiệu của lệnh phát xung vuông trong PLC với ngõ ra Y.
·  D500-D501 ( Double) : Là thanh ghi chứa giá trị của tần số phát xung, tính theo đơn vị Hz dạng số nguyên.
·  D510-D511 ( Double) : Là thanh ghi chứa số xung sẽ phát ra tại ngõ ra phát xung.
·  Y0 là địa chỉ của ngõ ra Y0, nơi mà xung sẽ được phát ra. Tùy theo loại PLC mà lựa chọn ngõ ra phát xung được quy định trong tài liệu.
·  M1029 là bít báo trạng thái của PLC: Khi M1029 ON, có nghĩa là lệnh phát xung ở ngõ ra Y0 đã phát đủ số xung trong thanh ghi D510-D511. 
·  Nếu D510-D511 = 0, khi đó PLC sẽ không hiểu theo nghĩa số xung phát ra = 0. PLC sẽ hiểu ngược lại là phát xung liên tục, không giới hạn. 
Chú ý: với mỗi loại PLC sẽ bị giới hạn tốc độ phát xung và số ngõ ra cho phép phát xung khác nhau. Người lập trình cần đọc kỹ tài liệu của PLC khi lựa chọn.
Tham khảo:
DVP14SS211T : phát xung 10kHz
DVP12SC11T : Phát xung 100kHz
DVP28SV11T : phát xung 200kHz
.....
Ngoài ra cần phải chú ý, với ngõ ra phát xung, PLC được chọn phải là dạng ngõ ra Transistor, tuyệt đối không phải Relay.

Khi nào thì lệnh phát xung có tác dụng ? 
Khi điều kiện lập trình đạt yêu cầu, xem hình ví dụ bên dưới:



Khi M111 ON, và giá trị D500 ( 16 bít, không phải Double 32 bit ) được đặt, lệnh phát xung sẽ có tác dụng, ngõ ra Y0 sẽ có một chuỗi xung vuông đến khi số xung phát ra bằng với thanh ghi D510. Và nếu D510 = 0 thì lệnh phát xung sẽ tạo ra một chuỗi xung liên tục đến khi bit M111 được OFF.
Ở đây tần số phát xung là D500 = 100Hz.

Làm sao để biết PLC đã phát xung hoàn thành, kết thúc:
Như đã nêu ở trên, bit M1029 sẽ báo trạng thái kết thúc lệnh phát xung khi số xung là 1 số khác 0 và bằng với giá trị lưu trong thanh ghi chứa số xung phát ra ( D510 ).
Lập trình viên có thể lập trình kiểm tra trạng thái của bit M1029 để xác nhận việc phát xung đã kết thúc.
Ví dụ khi lập trình máy cắt bao bì, với chiều dài túi tương đương với 5000 xung, chúng ta dùng lệnh trên và nạp giá trị phát xung là K5000 vào thanh ghi D510, tốc độ tùy theo yêu cầu và quy thành Hz nạp vào thanh ghi D500.
Khi nạp xong giá trị, Set ON bit M111, PLC sẽ thực hiện phát xung ở ngõ ra Y0, và khi phát đủ 5000 xung tương đương với chiều dài bao bì, Bit M1029 sẽ ON. Lúc này dùng logic lập trình để hủy phát xung <=> Set OFF M111, và thực hiện bước tiếp theo như ra lệnh cắt bao bì, thổi túi, ...

Cách lập trình tính toán chiều dài thực tế và quy thành chiều dài trên PLC
Chúng ta đã được biết, với ví dụ là tham số đặt số xung / vòng quay là 5000 xung. Đây là 1 điều kiện cần để tính toán chiều dài thực tế.
Sau khi có đầy đủ phần cơ khí, chúng ta cần tính thêm và phải đo thực tế hoặc tính toán thiết kế ngay từ ban đầu như sau: số mm / vòng quay của trục động cơ Servo. Tức là khi trục động cơ quay 1 vòng, phần dịch chuyển của máy di chuyển 1 chiều dài bao nhiêu? Giả sử là 25mm/ vòng quay.
Từ đó ta có công thức tính ứng với chiều dài dịch chuyển là 50cm <=> 500mm là :
            Số xung cần phát = ( chiều dài đặt ) / ( chiều dài / vòng quay  ) x ( số xung / vòng quay )
       => Số xung cần phát = 500 / 25 x 5000 = 100 000 xung.
Vậy chỉ cần viết lệnh phát đủ 100.000 xung thì động cơ sẽ quay và làm máy dịch chuyển 50cm.


Có một mẹo khi lập trình với số nguyên Int mà không muốn chuyển sang số thực Real là: thực hiện phép nhân trước và phép chia sau. Vì nếu thực hiện phép chia số nguyên, phần dư sẽ bị cắt bỏ. Khi đó càng về sau, sai số càng lớn.
Với việc đo thực tế, sẽ có sai số nhất định nhưng sẽ khiến việc thiết kế cơ khí không cần tính toán chi tiết tỷ số truyền của phần truyền động. Để lấy thêm độ chính xác, chúng ta có thể quy chiều dài ra giá trị nhỏ hơn. Sau kết quả thu được, chúng ta sẽ quy đổi về Cm hoặc mm tùy theo yêu cầu.

Cách lập trình tính toán tốc độ thực của theo tần số phát xung:
- Giả sử chúng ta phát xung với tần số 100Hz.
- Giả sử tốc độ định mức của động cơ là 3000 vòng/ phút, và tham số đặt số xung / vòng quay là 5000 xung/vòng quay.
=> Tính tốc độ động cơ tại tần số 100Hz ?
Cách tính như sau:
100Hz <=> 1 giây phát 100 xung => 1 phút phát số xung là : 100 x 60 = 6000 xung
=> số vòng quay / phút ở 100Hz là : 6000 / 5000 = 1.2 Vòng / Phút

Tại sao lại phải quan tâm tới tốc độ định mức của Motor khi thực hiện lệnh phát xung điều khiển ???
Giả sử với tốc độ 3000 vòng / phút, 5000 xung / vòng quay
=> số xung cần phát trong 1 phút là : 3000x5000 = 15.000.000 xung
=> số xung cần phát trong 1 giây là : 15.000.000 / 60 = 250.000 xung
=> Tần số phát xung để đạt tốc độ 3000 vòng/ phút là : 250.000 Hz = 250kHz
Vậy nếu chúng ta phát tần số > 250kHz, nghĩa là Drive sẽ nhận quá số xung định mức / giây => không điều khiển được, gây giật động cơ, có thể bị mất xung gây sai số về vị trí đã tính toán.

Tốc độ phát xung có ảnh hưởng gì tới lựa chọn PLC ???
Với mỗi loại PLC sẽ được thiết kế đặc biệt cho ngõ ra phát xung. Số lượng ngõ ra phát xung và tốc độ ( tần số ) ngõ ra tỷ lệ thuận với giá thành sản phẩm và hiệu quả của hệ thống.
Giả sử chúng tay chỉ cần phát 5kHz, khi đó chỉ cần lựa chọn PLC có tốc độ phát xung > 5kHz.
Ví dụ: DVP14SS211T : phát xung 10kHz
Hoặc nếu lựa chọn PLC phát xung tốc độ thấp khi cần tới tốc độ cao hơn sẽ không thể đáp ứng.
Nếu chúng ta  lập trình phát với tốc độ cao hơn tốc độ cho phép của PLC theo các cách tính ở trên, dẫn tới ngõ ra phát xung không đáp ứng được và có thể gây mất xung.

Sự khác nhau cơ bản giữa ngõ ra phát xung tốc độ cao và ngõ ra không phát xung hoặc tốc độ thấp ???
Ngõ ra phát xung được thiết kế bằng các linh kiện bán dẫn có tốc độ đóng cắt cao như Transistor trường ( Như Mos FET, ... )
Ngõ ra không có khả năng phát xung tốc độ cao như ngõ ra dạng Relay - do đáp ứng cơ cấu cơ khí chậm và tuổi thọ cơ khí khi đóng cắt nhanh là không cao gây lên việc không thể phát với tốc độ quá cao và không nên dùng để phát xung liên tục dù tốc độ thấp. Chu kỳ có thể là 1 hoặc nhiều hơn 1 giây nhưng vẫn gây giảm tuổi thọ đáng kể của Relay.
Ngõ ra không có khả năng phát xung tốc độ cao nhưng vẫn cho phép phát ở tốc độ thấp hơn bằng các lệnh tương tự, đó là ngõ ra dạng Transistor lưỡng cực BJT.
Các kiến thức về phần cứng - điện tử, các bạn vui lòng trao đổi trực tiếp hoặc tìm hiểu qua mạng và sách vở.