BẢN ĐỒ ĐỊA CHỈ CHO CHƯƠNG TRÌNH LADDER PLC MITSUBISHI
- 2022-04-16
- TỰ ĐỘNG HÓA
Bài viết sẽ giải thích tầm quan trọng và cách viết một bản đồ địa chỉ cho chương trình PLC. Qua bài viết người đọc sẽ có thêm một công cụ giúp cho việc lập trình trở nên dễ dàng và chuyên nghiệp hơn.
Tiếp nối bài trước, CẤU TRÚC CHƯƠNG TRÌNH PLC THEO CÁCH VIẾT NGƯỜI NHẬT, hôm nay mình sẽ giới thiệu cách lập một bản đồ địa chỉ để quản lý chương trình một cách có hệ thống hơn.
Vậy bản đồ địa chỉ là gì?
Đó thực ra là một list bao gồm các vùng địa chỉ được sắp xếp có trật tự và ý nghĩa của chúng. Khi nhìn vào đó, ta có thể nắm được các bit, thanh ghi có nhiệm vụ gì, đồng thời giúp ích cho người lập trình không bị rối khi thêm bớt chương trình mới, dành thời gian tập trung vào việc lập trình nhiều hơn là phải suy nghĩ nên chọn địa chỉ nào để lập trình. Nhờ đó chương trình của họ sẽ trở nên có hệ thống, dễ đọc, dễ hiểu hơn, về sau muốn thêm bớt cũng dễ dàng hơn nhiều so với một chương trình dùng biến lộn xộn phải không?
Chính vì lý do đó mà bản đồ địa chỉ là một công cụ rất có ích cho người lập trình, đặc biệt là chương trình càng lớn thì càng phát huy tác dụng của nó.
Mục lục:
|
Các dòng PLC của các hãng khác nhau sẽ có những vùng địa chỉ, tên gọi khác nhau. Ở đây người viết sẽ lấy PLC Q03UDVC của Mitsubishi làm ví dụ.
1. Mục đích của một bản đồ địa chỉ là gì?
Với một chương trình nhỏ đơn giản, người lập trình có thể không cần phân địa chỉ mà vẫn có thể lập trình một cách suôn sẻ.
Tuy nhiên với một dự án quy mô lớn, bạn sẽ luôn cảm thấy bị rối và mất tập trung khi chọn địa chỉ để lập trình nếu không được quy định ngay từ đầu. Do đó sẽ dễ sai sót, tốn nhiều thời gian để lập trình nhiều hơn. Cho dù chương trình có chạy tốt tại thời điểm đó đi chăng nữa, thì sau một vài năm, nếu có những yêu cầu hay thắc mắc của khách hàng thì thậm chí là người lập trình đó đi chăng nữa cũng sẽ gặp trường hợp không nhận ra code mình từng viết, hay tự nhủ
“Sao hồi đó code được cái này chạy được hay vậy ta???”
”Ủa e, code em viết mà hỏi gì kì vậy???”
Gặp trường hợp người đó nghỉ việc, giao cho người khác đảm nhận thì đến lúc đi xử lý sự cố, có khi cả ngày hôm đó còn hắt xì liên tục vì bị nhắc khéo nữa chứ ^^.
Vậy mục đích của cái bản đồ địa chỉ chính là giúp người lập trình đỡ mất thời gian suy nghĩ chọn địa chỉ, đồng thời giúp cho chương trình dễ hiểu và tăng tính kế thừa hơn cho sau này.
Có những bạn chia sẻ với mình rằng việc lập một bản đồ địa chỉ cho riêng mình sẽ giúp mình nhớ luôn vùng địa chỉ nào, dùng để làm gì, đến khi có vấn đề chẳng cần đọc lại từ đầu mà nhảy thẳng vào vùng địa chỉ gốc rồi truy lỗi. Thậm chí bản thân mình từng làm việc với mấy ông đồng nghiệp, cả cái chương trình hơn 20k steps mà nhắc tới lỗi nào là ổng đọc luôn bit nào, thanh ghi nào mà kiểm tra chứ khỏi mất công truy lỗi nữa. Thế giới này quả thật là đáng sợ ^^!
2. Những mục cần thiết cho một bản đồ địa chỉ
Khi bắt đầu lập một bản đồ, bạn nên phân ra một vùng cụ thể cho từng phần chứ không cần phải đi vào chi tiết từng bit, từng thanh ghi làm gì. Và nên lấy một khoảng có dư ra các vùng để tránh sau này chương trình tăng thêm thì lại làm khó chính mình.
Các mục cần thiết bao gồm:
Địa chỉ |
Nội dung |
Tham khảo |
M100-M499 |
Auto |
|
M500-M999 |
Manual |
|
+ Địa chỉ: Dĩ nhiên phải có địa chỉ rồi. Nên lấy theo đơn vị 100 hay 1000 cho dễ hiểu.
+ Nội dung: Với từng vùng của bit hay thanh ghi thì chức năng, ý nghĩa của nó là gì.
+ Tham khảo: Mục này để ghi chú thêm nếu trong phần nội dung không diễn tả hết ý nghĩa.
3. Những loại địa chỉ thường dùng
Với mỗi dòng, hãng PLC khác nhau thì các loại địa chỉ sẽ khác nhau. Tuy nhiên không phải có bao nhiêu loại địa chỉ thì dùng bấy nhiêu, mà những loại không sử dụng thì không cần lập bản địa chỉ làm gì cho đỡ mất thời gian.
Nhưng trước hết thì ta cùng xem có các loại địa chỉ như thế nào trước rồi tính tiếp. Như ở đầu bài mình giới thiệu, bài viết dùng PLC Q03UDVCPU để làm ví dụ, các loại khác thì các bạn có thể tham khảo manual của hãng để xem nhé.
Relay trung gian(bit)
Đây là một relay “giả tưởng” có chức năng như một relay bình thường và hầu như 100% các chương trình PLC đều dùng đến nó. Địa chỉ của nó được bắt đầu bằng “M + số thập phân”.
Với dòng PLC này thì giá trị khởi tạo ban đầu bắt đầu từ M0~M9215.
Relay latch(bit)
Cũng giống như Relay trung gian, nó cũng được dùng với chức năng của một Relay bình thường. Điểm khác biệt chính là khi mất điện, Relay trung gian sẽ bị reset về 0 khi điện được phục hồi, còn Relay latch sẽ giữ được trạng thái trước khi mất điện. Do đó nó thường được dùng cho việc lưu trữ cài đặt, lưu trữ tiến độ.
Ví dụ như ở dây chuyền rửa chai, đang từ giai đoạn rửa sang giai đoạn làm khô thì khi bị mất điện, những chai vừa rửa xong sẽ được “đánh dấu” đã rửa xong bằng 1 bit latch, rồi khi có điện lại, bit latch này vẫn lưu giữ trạng thái, sẽ giúp máy hiểu là những chai này đã được rửa, đi tiếp tới công đoạn phơi khô, chứ không cần phải quay lại từ đầu.
Địa chỉ này sẽ bắt đầu bằng “L + số thập phân”, giá trị khởi tạo ban đầu của PLC này sẽ có L0~L8191 để sử dụng.
Relay truyền thông(bit)
Đây là bit dùng trong truyền thông của các PLC với nhau. Thường dùng theo cách phân ra theo từng cục (station) giao tiếp trong cùng một mạng lưới với nhau, ví dụ cục số 1 thì chạy từ B0-> B3F, cục số 2 thì B40->B7F…
Địa chỉ của relay truyền thông sẽ được bắt đầu bằng “B + số thập lục phân”, với loại PLC này thì dãy địa chỉ mặc định từ B0~B1FFF.
Relay báo hiệu(Annunciator bit)
Là Relay dùng cho các bit alarm, cảnh báo, lỗi máy móc. Phải dùng lệnh SET và RST để ON/OFF các bit này. Khi các bit này ON, trên thân CPU có đèn USER màu đỏ sẽ sáng lên. Địa chỉ này được bắt đầu bằng “F + số thập phân”. Giá trị khởi tạo ban đầu sẽ bắt đầu từ F0~F2047.
Relay truyền thông đặc biệt(bit)
Là các relay hệ thống của block truyền thông, dùng để theo dõi trạng thái mạng, lỗi block. Địa chỉ bắt đầu bằng “SM + số thập lục phân”. Bao gồm SB0~SB7FF.
Bộ đếm thời gian timer(bit)
Đây là timer thường được dùng để delay, xác nhận tín hiệu mà các bạn lập trình chắc không ai không biết ^^. Khi điều kiện đầu vào ON, timer sẽ bắt đầu đếm, đạt đủ thời gian cài đặt, nó sẽ ON. Khi đầu vào OFF thì timer cũng sẽ được reset về 0. Địa chỉ được bắt đầu bằng “T + số thập phân”. Giá trị khởi tạo ban đầu là T0~T2047.
Bộ đếm thời gian tích lũy(bit)
Cũng giống bộ timer như trên, tuy nhiên khác nhau ở chỗ khi điều kiện đầu vào OFF, nó sẽ không bị reset về 0 mà sẽ lưu giữ lại giá trị đang đếm và sẽ tiếp tục đếm khi đầu vào ON. Chỉ có thể reset bằng lệnh RST. Địa chỉ được bắt đầu bằng “ST + số thập phân”. Giá trị khởi tạo ban đầu không có, do đó cần cài đặt trong Parameter số lượng timer cần dùng.
Bộ đếm counter(bit)
Đây cũng là bit quen thuộc của các bạn lập trình. Bộ đếm sẽ cộng 1 sau mỗi một chu kỳ quét (1 scan) nếu đầu vào ON, do đó nếu không cẩn thận dùng xung pulse cho đầu vào, sẽ dễ nhầm lẫn cho bộ đếm. Lý do là 1 vòng scan của CPU tầm vài chục nano giây, hết 1 vòng scan quay lại vẫn ON thì nó lại đếm lên 1 tiếp. Giả sử bấm 1 nút thì ON 1 lần nhưng thực tế trong thời gian mình nhấn cái nút tầm 0.1 giây thôi thì CPU đã chạy được vài chục vòng scan rồi….Thêm một điều chú ý là giá trị counter sẽ được lưu cho dù đầu vào không ON hay khi đếm đủ, do đó cần reset hoặc dùng lệnh MOVE k0 vào để reset giá trị counter này, nếu quên thì nhiều lúc thắc mắc sao đầu vào không ON mà nó lại đếm rồi???…. Địa chỉ được bằng đầu bằng “C + số thập phân”, giá trị ban đầu từ C0~C1023.
Thanh ghi(word)
Đây cũng là một trong những địa chỉ cơ bản mà chắc ai cũng biết. 1 thanh ghi word gồm 16 bit, dùng để chứa giá trị số cho tính toán. Tuy có thể dùng các bit của thanh ghi như 1 relay, tuy nhiên ngoài các thanh ghi đặc biệt thì cũng nên hạn chế tránh sử dụng để không làm phức tạp chương trình.
Địa chỉ được bắt đầu bằng “D + số thập phân”, ở giá trị khởi tạo ban đầu thì gồm D0~D13311. Ngoài ra cũng có thể cài đặt latch cho các thanh ghi này, để lưu lại giá trị cài đặt của máy móc chẳng hạn, để khi mất điện đột ngột thì không phải cài lại từ đầu.
Có lần mình quên cài latch cho những thanh ghi này, lúc chạy thử thì không xảy ra vấn đề gì, đến một vài tháng sau xảy ra sự cố mất điện, khách gọi điện đến phàn nàn vì thông số cài đặt bị mất hết, thế là lại mất công, mất tiền của cả khách lẫn mình, cho nên các bạn hãy lưu ý chỗ này nhé!
Thanh ghi tập tin(word)
Cũng giống với thanh ghi D ở trên, tuy nhiên khác ở chỗ nó mặc định tính năng latch, lưu lại giá trị khi bị mất điện. Thường được dùng nhiều nhất cho các mạch Recipe mà mình đã nhắc tới ở bài trước. Địa chỉ được bắt đầu bằng “ZR + số thập phân”, khởi tạo ban đầu sẽ không được dùng, do đó người lập trình muốn sử dụng thì phải cài đặt trong parameter.
Thanh ghi truyền thông đặc biệt(word)
Là những thanh ghi hệ thống của mạng truyền thông. Thường được dùng để xác định lỗi của mạng truyền thông, mã lỗi, cục (station) nào đang lỗi, thông số mạng…. Địa chỉ được bắt đầu bằng “SW + số thập lục phân”. Vùng địa chỉ từ SW0~SW7FF.
Thanh ghi chỉ số index(word)
Thanh ghi chỉ số là dùng cho các chỉ số của các địa chỉ. Chỉ cần thay đổi giá trị của thanh ghi này, có thể truy cập đến các thanh ghi khác nhau mà không cần thay đổi chương trình. Địa chỉ được bắt đầu bằng “Z + số thập phân”, và dòng PLC này chỉ có tối đa 20 thanh ghi chỉ số bắt đầu từ Z0~Z19, cảm giác thì có vẻ ít nhưng mình chưa bao giờ thấy chương trình nào dùng quá 10 thanh ghi này cả ^^.
Có lẽ thanh ghi này hơi khó hiểu với các bạn mới nên mình sẽ lấy ví dụ như sau:
Như hình bên có nút ở địa chỉ X1, khi bấm ON thì đèn Y1 sáng. Chương trình đơn giản được viết bằng chương trình PLC theo cách X1 = Y1 là xong. Tuy nhiên nếu có cả trăm cái đèn với trăm cái nút như vậy, việc viết từng đoạn Xn = Yn cũng không phải không làm được, tuy nhiên sẽ mất nhiều thời gian cho người lập trình.
Việc đó sẽ được giải quyết đơn giản nếu bạn dùng thanh ghi chỉ số, cách viết như sau:
Loop n (vòng)
X1Z0 = Y1Z0
Z0 = Z0 +1
if Z0 = n-1, break;
Mạch này sẽ có nghĩa là chỉ cần thanh ghi này chạy từ 1 đến n thì địa chỉ cũng sẽ chạy từ X1 đến Xn và Y1 đến Yn. Khi thanh ghi Z0 = 0 thì X1Z0 = X1, khi Z0 = 1 thì X1Z0 chính là X2,…. Khi Z = n-1 thì X1Z0 sẽ là Xn. Tương tự với Y1Z0.
Đây cũng giống như cách viết mà bạn thường gặp ở tin học đại cương hồi năm 1, tuy nhiên cách diễn tả chỉ khác đi mà thôi.
Như ví dụ trên thì nó được dùng nhiều trong vòng lặp, và ứng dụng nhiều cho việc viết Recipe.
4. Lập danh sách các vùng địa chỉ cần thiết
Ở trên mình đã liệt kê các loại địa chỉ của CPU Q03UVDCPU, tuy nhiên trong thực tế không phải dùng hết tất cả những loại địa chỉ trên, mà thường sẽ chỉ dùng một vài loại địa chỉ thường thấy như ví dụ dưới đây. Còn các loại khác thì tùy vào yêu cầu công nghệ mà bổ sung thêm.
- Relay trung gian M, relay latch L
M0000~0999:Bit hệ thống, dùng chung toàn bộ
M1000~1999:Mạch tự động
M2000~2999:Dự bị cho mạch tự động
M3000~3999:Mạch thủ công
M4000~4999:Mạch xử lý alarm
M5000~5999:Các mạch xử lý nhỏ khác
M6000~6999:Dự bị
M7000~7999:Các mạch cục bộ
M8000~9215:Mạch khẩn cấp
- Thanh ghi D
D0~D9999: Giống với relay trung gian M
D10000~: Dự bị
Tuy nhiên cần lưu ý vùng cài đặt latch cho nó tránh gây lãng phí vì lưu nhưng vùng dữ liệu không cần thiết.
Ngoài ra có một kinh nghiệm nhỏ là với mỗi đơn vị nên dùng 2 thanh ghi, và dùng số chẵn. Ví dụ D5000 dùng để hiển thị giá trị nhiệt độ 1, thì giá trị nhiệt độ 2 nên dùng D5002 thay vì D5001. Lý do là sẽ có nhiều lúc dùng những câu lệnh tính toán cần xử lý Double Word thay vì chỉ dùng Word, khi đó nếu dùng D5000 để tính toán, rất dễ sẽ bị lấn sang D5001, gây ra sai kết quả tính toán.
Cơ bản thì dùng những thanh ghi, relay như trên thì hầu như đã đáp ứng đầy đủ chương trình, thậm chí có thể dùng thanh ghi D để thay thế timer, counter. Do đó mình sẽ không liệt kê ra các vùng địa chỉ khác nữa.
5. Kết bài
Việc cần thiết để lập một bản đồ địa chỉ đã được mình nói ở trên rồi. Người lập trình sẽ trở nên chuyên nghiệp hơn nếu biết cách phân bố địa chỉ hợp lý, và sẽ trở thành thương hiệu riêng của cá nhân họ.
Cảm ơn bạn đã quan tâm đến bài viết của mình, hy vọng sẽ mang lại nhiều kiến thức bổ ích cho bạn.
Mình rất vui nếu nhận được những thắc mắc ở phần comment hoặc liên hệ với mình qua trang page: www.facebook.com/XTMechanicalBlog nhé.
Tác giả bài viết
Nhan Nguyen
0 Bình luận